2016-10-06 18 views
1

を再利用しますそれは生涯で、 "c"のスペースを再割り当てする代わりに、単にスペースを使用しますか?それがクラスではうまくいかない場合は、doubleやsize_tのような "伝統的な"型で動作しますか?は、私は次のコードを持っている場合は最適化をコンパイラおよび例えば、変数

頻繁に呼び出される関数の割り当てコストを最小限に抑えようとしています。しかし、関数の中のどこかでは、古い変数はすでに役に立たないと感じていますが、新しい変数はその名前と呼ばれるべきではありません。コンパイラは私のために変数を直接再利用しますか?

myClass a(...); 
something(a); 
if(...){ 
    #define c a 
    c=myClass(...); 
    something c; 
    #undef c 
} 
+3

あなたのプロファイラは、これがアプリケーションのホットスポットであると伝えますか?生成されたアセンブリの内容は何ですか? – GManNickG

+3

方法について: '{myClass a; a.doSomething(); } {if(...){myClass c; c.doSomething(); }} ' –

+0

関数本体に短いスコープがあっても、GCCはスタック空間を非常にうまく再利用するのに使いませんでした。しかし、私はそれがより良くなっていると信じています。 –

答えて

0

これらの変数はスタックに割り当てられます。コンパイラがスペースを再利用しなくても、追加のCPU命令、RAMのみにつながることはありません。スタック上の割り当ては、スタックポインタに割り当てられたバイト数を追加するだけです。通常は、関数に存在するすべての変数のサイズを加算することで1つの命令で完了します。そして、どのような場合でも、コンパイラは、変数が割り当てられているCPUレジスタを再利用するのに十分スマートになります。

クラスにデストラクタがある場合は、ブロックの最後まで保持する必要があることに注意してください。この場合、変数aのメモリは、関数の最後に必要となるため再利用されません。しかし、コンパイラはそれに使用されるレジスタを再利用することができます。

+1

それは積み重ねる必要がありますか?これらは単に「自動」変数です。スタックの使用は実装依存です。 –

+0

さて、それらは最適化され、レジスタに置かれるかもしれません。この場合、割り当てのコストはなく、レジスタの再利用は、コンパイラが十分に十分な処理をしなければならないものです。 –

5

一般に、コンパイラは、そのスコープの末尾まで、aを再利用することはできません。これは、関数の最後に閉じ括弧}です。この機能(オブジェクトを予測可能な時間に破棄)は、デストラクタがいくつかの特殊コード*を実行するときに、C++でガードを作成することを可能にします。

頻繁に呼び出される関数の割り当てコストを最小限に抑えようとしています。

自動変数の割り当てにはほとんど費用がかからないため、コストの大部分はコンストラクタを呼び出すことにあります。これは最適化できるものではありません。

*オブジェクトに些細なデストラクタがある場合、コンパイラはメモリを再利用できます。これはあなたの記憶を節約し、時間を節約します。

+0

すべてのオブジェクトにはデストラクタがあります。 – xaxxon

関連する問題