RVO(Return Value Optimization)2009/04/07 22:16

C++ では、俗に言う戻り値の最適化があります。これは、戻り値のコピー渡しによる非効率を避けるための方法です。その流れで、以下のようなコードを見つけました。

using namespace std;

class AAA{ public: AAA(){ cout << "AAA" << endl; } ~AAA(){ cout << "BYE" << endl; } };

void foo( AAA aaa ){

cout <<"FOO END" << endl; }

int main() { foo( AAA() ); // ここがポイント } AAA() と書いてあるところがポイントでこれをすることで、コピー渡しとはならずに、foo関数の引数を直接作成することができるそうです。ただ、このサンプルを動作させると、何故か、クラスAAAのデストラクタが2回呼び出されてしまいました(コンストラクタは1回のみ)。ううむ。不思議だ。と、非常に困っている雲でした。

コメント

_ easai ― 2011/08/13 23:38

なぜでしょうね。cygwin/g++ (OS: Windows7)での実行結果によると、デストラクタは1度きりしか呼ばれていませんよ。

ちなみにこれだと、変数にウォッチをかけられないですよね。最適化も、デバッグとメンテのことを考えると...

_ 雲 ― 2011/08/14 10:02

なんででしょうね?
VisualStudio 2010 で久しぶりに試しても、やっぱり、デストラクタは2回呼び出されているように思います。

ちなみに、最適化は、デバッグが終わった後に行うのが通常なので、基本的には、この状態でデバッグを必要とすることは無いようにするのが開発プロセスとしては正しい。と考えていますので、デバッグがしにくいことがこの手法のメリットを打ち消してしまうとは考えていませんが、いかがでしょうか?

雲の経験では、最適化をしたコードを使ってデバッグをするのは全くもってして意味が無く(時間がかかる。と言う意味で)、最適化前のコードとペアにして準備しておくことが必要だと思っています。

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※なお、送られたコメントはブログの管理者が確認するまで公開されません。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
今年は、西暦何年でしょう?
(半角数字で2020と回答下さい)

コメント:

トラックバック