叫我学弟 2020-08-10 14:33 采纳率: 0%
浏览 115
已采纳

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)
    它不能编译,虽然表面上看没有调用拷贝构造函数。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 我需要全国每个城市的最新小区名字等数据。
  • ¥15 开发一个小区生态的小程序
  • ¥15 MddBootstrapInitialize2失败
  • ¥15 LCD Flicker
  • ¥15 Spring MVC项目,访问不到相应的控制器方法
  • ¥15 esp32在micropython环境下使用ssl/tls连接mqtt服务器出现以下报错Connected on 192.168.154.223发生意外错误: 5无法连接到 MQTT 代理,如何解决?
  • ¥15 关于#genesiscsheel#的问题,如何解决?
  • ¥15 Android aidl for hal
  • ¥15 STM32CubeIDE下载程序报错
  • ¥15 微信好友如何转变为会员系统?(相关搜索:小程序)