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

标签 c++ gcc visual-c++-2008

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

相关文章:

c++ - 为什么 GCC 不能优化 "x && (x & 4242)"到 "x & 4242"中的逻辑/按位与对?

linux - 如何在 Linux 用户空间中创建 *.a 到 *.so?

gcc - Cortex-M4 和 GCC - float 行为

c++ - 如何用visual studio 2008打开vcxproj(visual c++项目)

c++ - SFML - 如何获得预期的字符串宽度?

python - 一起调试boost暴露的Python和C++

c++ - 现有 DLL 函数的 Typedef 返回函数错误

c++ - 具有奇怪的重复模板模式的数组?

php - 使用 Visual Studio 2008 编译 php 扩展,MODULE ID 与 php 不匹配

c++ - ~A(){} 和 ~A() throw(){} 有什么区别,其中 A 是类名?