3

因此,这在 GCC、CLANG 和 MSVC 上编译得很好,但输出不同:

#include <iostream>
using namespace std;

class A {
 public:
    A() {
        cout << this << " def" << endl;
    }
    A(const A&) {
        cout << this << " copy" << endl;
    }
    A(A&&) {
        cout << this << " move" << endl;
    }
    A& operator= (const A&) {
        cout << this << " copy=" << endl;
        return *this;
    }
    A& operator= (A&&) {
        cout << this << " move=" << endl;
        return *this;
    }

    ~A() {
        cout << this << " ~A" << endl;
    }
};

A f() { 
    A a;
    return a; 
}

int main(){
    A a = f();
}

使用 GCC 和 CLANG 输出:

  • 0xbfad67cf 定义
  • 0xbfad67cf ~A

虽然 MSVC out 符合预期(C++11 标准):

  • 0039FA3B 定义
  • 0039FA3B 移动
  • 0039FA3B ~A

因此,使用 MSVC 编译的代码调用移动构造函数,而使用 GCC 和 CLANG 编译的代码不会调用移动构造函数。我还尝试禁用优化,但仍然得到相同的输出。更奇怪的是,当我将 f() 更改为返回 A() 时,即使在 MSVC 上也不会调用移动构造函数。

编译器版本:

  • gcc:版本 4.7.2 (GCC)
  • clang:版本 3.2(标签/RELEASE_32/final)目标:i386-pc-linux-gnu

平台: Linux/ArchLinux

4

1 回答 1

6

那就是返回值优化

http://en.wikipedia.org/wiki/Return_value_optimization

编译器优化的返回对象不被复制而不是被删除

于 2013-03-27T16:51:52.490 回答