2016-09-08 5 views
1

は、コードのシンプルな作品を考えてみましょう:std :: unique_ptr <Dervied>からstd :: unique_ptr <Base>への変換にかかる費用はいくらですか?

class Base {}; 
class Derived : public Base {}; 

std::unique_ptr<Base> foo() 
{ 
    return std::make_unique<Derived>(); 
} 

私はstd::unique_ptrも同様に継承し、うまく関連する型の変換を管理して知っています。しかし、実際にはstd::unique_ptr<Base>std::unique_ptr<Derived>が無関係であり、継承ではなく変換によって、提供されたコードが可能であり(動作します)、本当ですか?

この場合、この変換にはコストが必要です。私はDerived&からBase&への変換が無料であると仮定します。このstd::unique_ptrは私に多くの費用がかかりますか?


注:質問関数が存在するという仮定に基づいています。

  • たくさん呼ばれ、
  • は、上記の変換を経由して、あるいは汚れた方法で実装することができます。return std::unique_ptr<Base>(new Derived());
  • パフォーマンスはキングです。
+0

このコードをWork As Expectedにするユーザー定義の変換があります。 C++のパワーは、このようなライブラリコンポーネントを自然に感じ取ることができ、言語自体の中で完全に行うことができるということです。 –

答えて

2

変換は基本的に自由でなければなりません。 std::unique_ptrはポインタ周りのラッパーに過ぎず、std::unique_ptr<Derived>std::unique_ptr<Base>に格納されているポインタ間の「変換」は純粋に形式的です(つまり、型システム内でのみ発生します)。実際の値は変更されません。

in the generated codeこれは、ポインタと削除者を新しいstd::unique_ptrにコピーして、古いもののポインタをゼロにすることになります。

+1

ニースサイト、それを覚えておく必要があります。正確なコストを知ってよかった、ありがとう! – hauron

2

std::unique_ptr<Dervied>からstd::unique_ptr<Base>への変換にかかる費用はいくらですか?

Derived&からBase&への変換は無料と思われます。このstd::unique_ptrは私に多くの費用がかかりますか?

適用される最適化レベルによって異なります。しかし、OPから、あなたはおそらく本質的に何かをオンにしている。ポインタの変換は非常に安価です。

コストを真に評価するには、バイナリをチェックする必要があります。この出力のサンプルはSee hereです。

foo():        # @foo() 
     pushq %rbx 
     movq %rdi, %rbx 
     movl $1, %edi 
     callq operator new(unsigned long) 
     movq %rax, (%rbx) 
     movq %rbx, %rax 
     popq %rbx 
     retq 
関連する問題