叫我学弟
2020-08-10 14:33
采纳率: 33.3%
浏览 98

C++类拷贝构造函数不同编译器执行结果不同的问题

有这样一段极其简单的c++代码,在Clion和vs2019内执行结果不同

class Circle {
public:

    Circle() {
        cout << "默认构造函数" << endl;
    }

    Circle(const Circle &c) {
        cout << "引用构造函数" << endl;
    }
};

Circle work1() {
    Circle c1;
    cout << (int *) &c1 << endl;
    return c1;
}

void work2(Circle c) {
    cout << (int *) &c << endl;
}

int main() {
    Circle c2 = work1();
    cout << (int *) &c2 << endl;
    return 0;
}

clion环境:mingw-x64,cmake3.17.4

vs2019:默认x64环境

work2函数和主函数都输出了一个内存地址。

work2函数输出的形参c的内存地址,主函数输出work1函数返回的内存地址。

在jetbrains Clion中,这两个内存地址相同,但在vs2019内,这两个内存地址却不同,是为什么呢?

是与编译器有关吗?求大佬们解答,刚学c++,要吐了。

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • threenewbee 2020-08-10 15:58
    已采纳

    这个和编译器有关,和开发环境无关
    只能说gcc在这里有一个优化,可以直接通过堆栈返回对象,少调用一次拷贝构造函数,并且这是优化的结果
    也就是说,如果你把
    Circle(const Circle c)
    修改下,比如修改为
    Circle(Circle c)
    它不能编译,虽然表面上看没有调用拷贝构造函数。

    1 打赏 评论

相关推荐 更多相似问题