1

次のコードは、GCC と vc9 でコンパイルすると、異なる数のデストラクタを示します。私の知る限り、vc9 で実行すると、5 つのデストラクタが表示されますが、これは理解できます。+ オーバーロードされた演算子が呼び出され、一時オブジェクトが作成されると、2 つのオブジェクトが作成されます。これにより、3 つのオブジェクトの破壊が可能になります。オーバーロードされた = 演算子が呼び出されると、1 つのオブジェクトが作成され、返されるときに再び一時的なオブジェクトが作成されます。これにより、main の開始時に作成された 3 つのオブジェクトを数えずに、合計で 5 つの destruct になります。

しかし、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;
}
4

4 に答える 4

3

GCC は一時をスキップする「戻り値の最適化」を実装しています。VC9 をリリース モードに設定すると、おそらく同じことが行われます。

GCC が本当に優れている場合、temp内部operator+は と同じようにデフォルトで初期化され、関数をインライン化しようとすると直接somewhereDark参照を使用できることがわかります。somewhereDarkまたは、値渡しが役に立たず、代わりに参照渡しできることがわかります。

于 2009-08-23T18:11:41.973 に答える
2

C++ コンパイラで許容されるが必須ではない最適化は、タイト シーケンスを変更することです。

ctor for new temporary object X
copy ctor from X to other object Y
dtor for X

Y に対して ctor を直接実行するだけです。本当に優れた C++ オプティマイザーは、関数 clal 全体でこれを行うことができます (つまり、X が関数の戻り値である場合)。gcc の最適化が進んでいるようです。2 つのコンパイラの最適化オプションを試してみると、結果は変わりますか?

于 2009-08-23T18:11:21.583 に答える
2

コードには多くの問題があります。const と reference という 2 つの概念を調査することをお勧めします。あなたの C++ のテキスト ブックにこれらが含まれていない場合は、新しいテキスト ブックを入手してください 。Koenig & Moo によるAccelerated C++を強くお勧めします。

于 2009-08-23T18:23:04.103 に答える
0

実際、GCC では、テンポラリが作成されています。彼らです:

  • 演算子 + で。
  • operator+ によって返されます。
  • operator= によって返されます。

MSVC (私は思う; テストできない) では、一時的なものも作成されています。ただし、GCC のように最適化されていないものもあります。彼らです:

  • operator+ へのパラメーターとして。
  • 演算子 + で。
  • operator+ によって返されます。
  • operator= へのパラメーターとして。
  • operator= によって返されます。

皮肉なことに、GCC の動作が標準であるかどうかわからないため、MSVC はここにあると思います。

両方が同じように動作するようにするconstには、オブジェクトを値で渡す代わりに参照を使用します。

于 2009-08-23T18:17:49.107 に答える