叫我学弟 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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵