2015-10-14 12 views
10

これは非常に単純な質問です:グローバル変数0に初期化ペナルティ

は0初期化グローバル変数と静的変数は、実行時に(非常に小さいとはいえ)任意のパフォーマンスの低下を持っていますか?

+1

通常、静的な記憶期間を持つ変数は、実行可能ファイルの '.DATA'ブロックに入れられ、コード生成時にゼロになります。だから私の知る限りでは答えは「いいえ」です。実際、私は歴史的にこれが、静的な記憶期間を持つ変数がゼロ初期化されている理由だと思います。なぜなら、これはペナルティがないからです。 – Rostislav

+0

@Rostislavローダーが 'memcpy(loading_address、address_of_data_section_with_zeroes、size_of_data_section)'のようなものを実行しているということですか? – Dean

+0

@Rostislav、あなたは間違っています、あなたは非常に重要な点を欠いています - 非ポッドのデフォルト初期化。 – SergeyA

答えて

11

いいえ、C++(およびC)標準では、プログラマによって明示的に初期化されていないすべてのグローバル/静的変数は0に初期化されなければならないことを示しています。そのような変数は.bssという特別なセグメントに置かれます。 main()が呼び出される前にゼロに初期化されます。

グローバル/静的を明示的に初期化するが、値を0にすると、コンパイラーはこれを実現し、まだbssセグメントに入れることができるほどスマートです。


あなたはこのような例を自分のためにこれをテストすることができます。この例では

#include <stdio.h> 

static int uninit; 
static int init_zero=0; 
static int init_one=1; 

int main (void) 
{ 
    printf("%p\n", &uninit); 
    printf("%p\n", &init_zero); 
    printf("%p\n", &init_one); 

    return 0; 
} 

uninitinit_zero変数は、(おそらく4バイト互いに離れる隣接するメモリアドレスになってしまいます)は両方とも.bssセグメントにあるためです。しかし、init_one変数は、.dataセグメントに割り当てられているため、完全に別の場所になります。

+2

標準ではゼロ初期化が必要だと言われていますが、 '.bss'セグメントについては何も疑いがあります。したがって、実行時にゼロ初期化が実行されるアーキテクチャが存在する可能性があります - これは正しいですか? – Rostislav

+0

@Rostislav標準には言及していませんが、 '.bss'は伝統的には8ビットマイクロコントローラから64ビットPCまでのほぼすべてのプラットフォームのセグメント名です。実際には、ほとんどすべてのアプリケーションが実行時にこれを行います。PCなどのRAMベースのシステムでも、プログラムが起動する前には常にさまざまなコードが実行されます。マイクロコントローラのようなROMベースのシステムでは、実行時にいわゆる "ゼロアウト"を実行する以外に選択肢はありません。 – Lundin

+0

[この回答](http://stackoverflow.com/questions/9535250/why-is-the-bss-segment-required/9535579#9535579)に例があります。 – Lundin

-2

0の初期化(の一部である)からデフォルトの初期化までの質問を拡張すると、通常、アプリケーションのパフォーマンスには大きな影響はありません。ただし、コンストラクタでデータベースルックアップなどのクラスを設計するのは簡単です。したがって、アプリケーションの起動時に目立つ興味深い効果が得られます。

関連する問題