gpt4 book ai didi

c++ - vc9 和 gcc 之间不同的析构函数行为

转载 作者:行者123 更新时间:2023-11-30 00:42:19 24 4
gpt4 key购买 nike

以下代码在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com