鱼C论坛

 找回密码
 立即注册
查看: 1437|回复: 2

[已解决]不同环境下的拷贝构造函数差异化问题

[复制链接]
发表于 2023-1-21 23:37:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
近期学到了拷贝构造函数这里,视频中(黑马程序员的视频),老师用的是 MSVC 环境,我本人用的是 G++ 的环境,代码完全一样,但是出现了完全不同的效果,先上代码:

  1. #include <iostream>

  2. using namespace std;

  3. class Person {
  4. public:
  5.     Person() {
  6.         cout << "默认 构造 OK~" << endl;
  7.     }

  8.     Person(int age) {
  9.         m_Age = age;
  10.         cout << "有参 构造 OK~" << endl;
  11.     }

  12.     Person(const Person &p) {
  13.         m_Age = p.m_Age;
  14.         cout << "拷贝 构造 OK~" << endl;
  15.     }

  16.     ~Person() {
  17.         cout << "析构调用~~" << endl;
  18.     }

  19.     int m_Age;
  20. };

  21. Person doWork() {
  22.     Person p1;
  23.     cout << (int*)&p1 << endl;
  24.     return p1;
  25. }

  26. void test() {
  27.     Person p3 = doWork();
  28.     cout << (int*)&p3 << endl;
  29. }

  30. int main() {
  31.     test();

  32.     system("pause");
  33.     return 0;
  34. }
复制代码


老师在运行的时候,上述的第 30 行和第 36 行,打印出来的结果,是两个完全不相同的地址(MSVC 环境下),但是我在本地运行时,地址却是相同的。。

这里老师解释了,在 doWork 函数中,会调用默认构造函数,但是在 test 函数中,会调用拷贝构造函数,所以这里的地址会不同,可是在 G++ 环境中,这两个地址是完全相同的,求教各位鱼油大佬,这里的区别是什么呀?

下面是补充的运行结果

这是老师的运行结果:
老师的结果.png

这是我的运行结果:
我的结果.png
最佳答案
2023-1-21 23:56:17
g++对此做了优化,可以使用 -fno-elide-constructors 来关掉这个优化

  1. sh-5.1$ g++ -g -Wall -o main main.cpp
  2. sh-5.1$ ./main
  3. 默认 构造 OK~
  4. 0x7ffd331142d4
  5. 0x7ffd331142d4
  6. 析构调用~~
  7. sh-5.1$ g++ -g -Wall -fno-elide-constructors -o main main.cpp
  8. sh-5.1$ ./main
  9. 默认 构造 OK~
  10. 0x7ffd023a2bf4
  11. 拷贝 构造 OK~
  12. 析构调用~~
  13. 0x7ffd023a2c24
  14. 析构调用~~
  15. sh-5.1$
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-21 23:56:17 | 显示全部楼层    本楼为最佳答案   
g++对此做了优化,可以使用 -fno-elide-constructors 来关掉这个优化

  1. sh-5.1$ g++ -g -Wall -o main main.cpp
  2. sh-5.1$ ./main
  3. 默认 构造 OK~
  4. 0x7ffd331142d4
  5. 0x7ffd331142d4
  6. 析构调用~~
  7. sh-5.1$ g++ -g -Wall -fno-elide-constructors -o main main.cpp
  8. sh-5.1$ ./main
  9. 默认 构造 OK~
  10. 0x7ffd023a2bf4
  11. 拷贝 构造 OK~
  12. 析构调用~~
  13. 0x7ffd023a2c24
  14. 析构调用~~
  15. sh-5.1$
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-22 00:05:24 | 显示全部楼层
人造人 发表于 2023-1-21 23:56
g++对此做了优化,可以使用 -fno-elide-constructors 来关掉这个优化

感谢指导,确实有效
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 03:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表