C でのコピー コンストラクターの最適化
C では、特定の状況下でコピー コンストラクターが呼び出されない場合があり、コンパイラーの最適化またはこの言語の文書化されていない機能。
次の点を考慮してください。 code:
class A { public: A(int value) : value_(value) { cout << "Regular constructor" << endl; } A(const A& other) : value_(other.value_) { cout << "Copy constructor" << endl; } private: int value_; }; int main() { A a = A(5); }
出力には「通常のコンストラクター」メッセージと「コピー コンストラクター」メッセージの両方が含まれることが期待されます。ただし、この場合、コピー コンストラクターは呼び出されません。
この動作は、コンパイラの最適化でも、文書化されていない C の機能でもありません。代わりに、T = x; のような代入が C 標準 (§12.8.15) で明示的に指定されています。は T(x); として解釈でき、コピーの必要がない場合は内部の T を効果的に削除します。
この特定のケースでは、コンパイラは A オブジェクトを構築してからそれをコピーすることが冗長であると認識します。したがって、コピー コンストラクターの呼び出しは省略されます。
コピー コンストラクターの呼び出しを強制するには、最初の A を明示的に作成できます。オブジェクト:
A a; // Construct an empty A object a = A(5); // Copy-initialize it with another A object
以上がC がコピー コンストラクターをスキップするのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。