有这样一段极其简单的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++,要吐了。
这个和编译器有关,和开发环境无关
只能说gcc在这里有一个优化,可以直接通过堆栈返回对象,少调用一次拷贝构造函数,并且这是优化
的结果
也就是说,如果你把
Circle(const Circle c)
修改下,比如修改为
Circle(Circle c)
它不能编译,虽然表面上看没有调用拷贝构造函数。