以下代码在 GCC 和 vc9 上编译时提供了不同数量的析构函数。据我所知,在 vc9 上运行时我会显示 5 个析构函数。 + 重载运算符被调用,并创建了两个对象,返回时创建了一个临时对象。这使得销毁 3 个对象成为可能。调用重载 = 运算符时,将创建一个对象,并在返回时再次创建一个临时对象。这加起来有五个析构,不包括在 main 开始时创建的三个对象。
但是当我在 GCC 上编译时我得到 3。
这让我猜测函数终止并返回时没有创建临时对象?或者关于编译器之间不同行为的问题。我根本不知道,最好能澄清一下。
#include <iostream>
using namespace std;
class planetCord {
double x, y, z;
public:
planetCord() { x = y = z = 0; }
planetCord(double j, double i, double k) { x = j; y = i; z = k; }
~planetCord() { cout << "destructing\n"; }
planetCord operator+(planetCord obj);
planetCord operator=(planetCord obj);
void show();
};
planetCord planetCord::operator +(planetCord obj) {
planetCord temp;
temp.x = x + obj.x;
temp.y = y + obj.y;
temp.z = z + obj.z;
return temp;
}
planetCord planetCord::operator =(planetCord obj) {
x = obj.x;
y = obj.y;
z = obj.z;
return *this;
}
void planetCord::show() {
cout << "x cordinates: " << x << "\n";
cout << "y cordinates: " << y << "\n";
cout << "z cordinates: " << z << "\n\n";
}
int main() {
planetCord jupiter(10, 20, 30);
planetCord saturn(50, 100, 200);
planetCord somewhereDark;
jupiter.show();
saturn.show();
somewhereDark.show();
somewhereDark = jupiter + saturn;
jupiter.show();
saturn.show();
somewhereDark.show();
return 0;
}
最佳答案
GCC 正在实现“返回值优化”以跳过临时对象。将 VC9 设置为 Release 模式,它可能会执行相同的操作。
如果 GCC 真的很好,它会看到 operator+
中的 temp
将被默认初始化,就像 somewhereDark
一样,并且可以如果它试图内联函数,则直接使用对 somewhereDark
的引用。或者它看到按值传递是无用的,可以改为按引用传递。
关于c++ - vc9 和 gcc 之间不同的析构函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1319165/