foxiangzun 发表于 2023-1-21 23:37:22

不同环境下的拷贝构造函数差异化问题

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

#include <iostream>

using namespace std;

class Person {
public:
    Person() {
      cout << "默认 构造 OK~" << endl;
    }

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

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

    ~Person() {
      cout << "析构调用~~" << endl;
    }

    int m_Age;
};

Person doWork() {
    Person p1;
    cout << (int*)&p1 << endl;
    return p1;
}

void test() {
    Person p3 = doWork();
    cout << (int*)&p3 << endl;
}

int main() {
    test();

    system("pause");
    return 0;
}


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

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

下面是补充的运行结果

这是老师的运行结果:


这是我的运行结果:

人造人 发表于 2023-1-21 23:56:17

g++对此做了优化,可以使用 -fno-elide-constructors 来关掉这个优化

sh-5.1$ g++ -g -Wall -o main main.cpp
sh-5.1$ ./main
默认 构造 OK~
0x7ffd331142d4
0x7ffd331142d4
析构调用~~
sh-5.1$ g++ -g -Wall -fno-elide-constructors -o main main.cpp
sh-5.1$ ./main
默认 构造 OK~
0x7ffd023a2bf4
拷贝 构造 OK~
析构调用~~
0x7ffd023a2c24
析构调用~~
sh-5.1$

foxiangzun 发表于 2023-1-22 00:05:24

人造人 发表于 2023-1-21 23:56
g++对此做了优化,可以使用 -fno-elide-constructors 来关掉这个优化

感谢指导,确实有效{:9_232:} {:9_232:} {:9_232:}
页: [1]
查看完整版本: 不同环境下的拷贝构造函数差异化问题