ホームページ >バックエンド開発 >C++ >C がコピー コンストラクターをスキップするのはどのような場合ですか?

C がコピー コンストラクターをスキップするのはどのような場合ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-21 08:10:10221ブラウズ

When Does C   Skip the Copy Constructor?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。