叫我学弟 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 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler