2

为什么在这个程序中只创建了一个 A 对象?并且没有调用复制构造函数。这种优化叫什么?如果这是一个有效/已知的优化,它不会是多吨设计模式的麻烦吗?

#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++ 世界中是值得注意的,因为它允许改变程序的可观察行为。这是少数(如果不是唯一的话)允许这样做的优化之一,并且从返回副本被认为是弱点的日子开始。(使用移动语义和通常更快的机器,现在这已经不是问题了。)

基本上,编译器看到它将复制对象,因此它在调用框架上为其分配空间,然后在那里构建它,而不是调用复制构造函数。

于 2013-10-31T04:36:44.210 回答