2017-06-19 15 views
3

私は、あなたが現代のコンパイラよりも良い決定をしていると考える特別な理由がない限り、Cでレジスタ変数を使用しないことをお勧めします。Cの静的ローカル変数は実行速度に影響しますか?

ローカル静的変数は関数の呼び出しの間にありますが、実行速度が重要なときに静的変数を使用するのは意味がありますか?

私は6502エミュレータで作業しています(楽しく学習するためです)。エミュレートされた操作のほとんどはローカル変数を必要としませんが、いくつかはそうします。私は下の例を貼り付けました。基本的には、これらの変数を静的変数として宣言することに何らかの利点があるのだろうかと思います。関数呼び出しの間で値を保持するのではなく、その都度ストレージスペースが再割り当てされないようにします。これはコンパイラに任せておくのが最善でしょうか?事前:)典型的なx86システムで

+1

しかし、静的変数と非静的変数は異なるセマンティクスを持っていますか?彼らの寿命は異なります。正確には交換できません。 –

+5

もう少し早すぎる最適化*のケースです。パフォーマンスの問題を*(間違いなく)特定した後にのみ最適化します。つまり、スタックポインタが何バイト変更されるかはCPUの問題ではないと思うので、ローカル変数(典型的なスタックベースの実装では)はそれほど遅くはありません。 –

+0

変数を静的にすると、コードを読みにくくなり、デバッグが難しくなり、非常に興味深いバグの原因となります。潜在的な速度の改善があれば、これらの欠点を相殺することができると私は非常に疑念を抱いています。 – zoul

答えて

7

、あなたは関数を入力するとき、ローカル変数のためのスペースを確保するには、追加の計算コストは​​ありませんで

static void 
op_asl_zero_page_x (CPU *cpu) 
{ 
    unsigned int result; 
    Word addr; 
    Byte b; 

    addr = zero_page_addr_XX (cpu, cpu->x); 
    b = bus_read (cpu->bus, addr); 

    /* Copy highest bit to carry */ 
    cpu->status[CPU_STATUS_C] = ((b & 0x80) != 0); 

    result = (unsigned int)b << 1; 
    bus_store (cpu->bus, addr, result); 
    cpu_set_N_Z (cpu, result); 
} 

感謝。

関数の入力は、スタックポインタの移動を意味します。それを8バイト移動することは、それを16バイト移動するよりも安価ではありません。それはアセンブリ命令の同じシーケンスです。

あなたはスタックに、より多くのメモリを使用しているが、あなたは、いくつか真剣に深い再帰を行うことを計画していない限り、あなたはそれを心配してはいけません。これらのすべては、コンパイラが実際にスタックを使用して変数の内容を格納することを前提としています(レジスタにマップされている可能性があります)。

したがって、計算上、コストはかかりません。メモリの面では、ほとんどコストがかかりません。

+0

ありがとう、slezicaなど。私は、コンパイラがどのようにしているかについてはかなり曖昧ですが、これは私が学ぶのを助けるプロジェクトのようなものです。あなたの答えは物事を明確にします:) –

+2

これに加えて、「静的な」記憶期間とは、変数がプログラムの完全な実行時間に亘っていることを意味します。そのため、コンパイラはその変数をメモリに保存/離れて。静的でなければ、レジスタを使用することができる。 –

0

私は静的関数を宣言するだけで、この関数は現在のファイル(xxx.o)でしか使用できず、他の利点はないことをコンパイラに伝えていると思います。

+1

「static」ストレージクラスは、リンケージ*と*ストレージ時間を指定します。[my answer here](https://stackoverflow.com/a/44614284/2371524)を参照してください。 Plus OPは関数そのものではなく、変数について話していました。 –

関連する問題