2

このプログラムで A のオブジェクトが 1 つだけ作成されるのはなぜですか? コピー コンストラクターは呼び出されません。この最適化は何と呼ばれますか? これが有効な/既知の最適化であれば、マルチトンの設計パターンでは問題になりませんか?

#include <iostream>
#include <stdio.h>
using namespace std;

class A
{
    public:
        A () {
            cout << "in-- Constructor A" << endl;
            ++as;
        }

        A (const A &a) {
            cout << "in-- Copy-Constructor A" << endl;
            ++as;
        }

        ~A() {
            cout << "out --Constructor A" << endl;
            --as;
        }

        A & operator=(const A &a) {
            cout << "assignment" << endl;
            ++as;
            //return *this;
        }

        static int as;
};
int A::as = 0;


A fxn() {
    A a;
    cout << "a: " << &a << endl;
    return a;
}

int main() {

    A b = fxn();
    cout << "b: " << &b << endl;

    cout << "did destructor of object a in func fxn called?" << endl;
    return 0;
}

上記プログラムの出力

in-- Constructor A
a: 0x7fffeca3bed7
b: 0x7fffeca3bed7
did destructor of object a in func fxn called?
out --Constructor A
4

2 に答える 2

1

リンクhttp://cpp-next.com/archive/2009/08/want-speed-pass-by-value/ にアクセスしてください。

于 2013-10-31T10:08:59.163 に答える
1

これは、戻り値の最適化のケースのようです。この最適化は、プログラムの観察可能な動作を変更できるため、C++ の世界では注目に値します。これは、唯一ではないにしても、それを可能にする数少ない最適化の 1 つであり、コピーを返すことが弱点と見なされていた時代のものです。(移動のセマンティクスと一般的に高速なマシンにより、これは今ではほとんど問題になりません。)

基本的に、コンパイラはオブジェクトをコピーしようとしていることを認識しているため、代わりに呼び出し元のフレームにスペースを割り当て、コピー コンストラクターを呼び出す代わりにそこにビルドします。

于 2013-10-31T04:36:44.210 に答える