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
_ 雲 ― 2011/08/14 10:02
なんででしょうね?
VisualStudio 2010 で久しぶりに試しても、やっぱり、デストラクタは2回呼び出されているように思います。
ちなみに、最適化は、デバッグが終わった後に行うのが通常なので、基本的には、この状態でデバッグを必要とすることは無いようにするのが開発プロセスとしては正しい。と考えていますので、デバッグがしにくいことがこの手法のメリットを打ち消してしまうとは考えていませんが、いかがでしょうか?
雲の経験では、最適化をしたコードを使ってデバッグをするのは全くもってして意味が無く(時間がかかる。と言う意味で)、最適化前のコードとペアにして準備しておくことが必要だと思っています。
VisualStudio 2010 で久しぶりに試しても、やっぱり、デストラクタは2回呼び出されているように思います。
ちなみに、最適化は、デバッグが終わった後に行うのが通常なので、基本的には、この状態でデバッグを必要とすることは無いようにするのが開発プロセスとしては正しい。と考えていますので、デバッグがしにくいことがこの手法のメリットを打ち消してしまうとは考えていませんが、いかがでしょうか?
雲の経験では、最適化をしたコードを使ってデバッグをするのは全くもってして意味が無く(時間がかかる。と言う意味で)、最適化前のコードとペアにして準備しておくことが必要だと思っています。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。
※投稿には管理者が設定した質問に答える必要があります。
ちなみにこれだと、変数にウォッチをかけられないですよね。最適化も、デバッグとメンテのことを考えると...