代码在使用clang和gcc编译时没有调用Move构造函数

Code not calling Move constructor when compiled with clang and gcc

本文关键字:调用 构造函数 Move 编译 gcc clang 代码      更新时间:2023-10-16

所以,这在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 def
  • 0 xbfad67cf ~

当使用MSVC时,如预期(c++ 11标准):

    0039 fa3b def
  • 0039 fa3b
  • 0039 fa3b ~

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

编译版本:

  • gcc: version 4.7.2 (gcc)
  • clang: version 3.2 (tags/RELEASE_32/final)目标:i386-pc-linux-gnu

平台: Linux/ArchLinux

即返回值优化

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

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