答えて
いいえ、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;
}
、uninit
とinit_zero
変数は、(おそらく4バイト互いに離れる隣接するメモリアドレスになってしまいます)は両方とも.bss
セグメントにあるためです。しかし、init_one
変数は、.data
セグメントに割り当てられているため、完全に別の場所になります。
標準ではゼロ初期化が必要だと言われていますが、 '.bss'セグメントについては何も疑いがあります。したがって、実行時にゼロ初期化が実行されるアーキテクチャが存在する可能性があります - これは正しいですか? – Rostislav
@Rostislav標準には言及していませんが、 '.bss'は伝統的には8ビットマイクロコントローラから64ビットPCまでのほぼすべてのプラットフォームのセグメント名です。実際には、ほとんどすべてのアプリケーションが実行時にこれを行います。PCなどのRAMベースのシステムでも、プログラムが起動する前には常にさまざまなコードが実行されます。マイクロコントローラのようなROMベースのシステムでは、実行時にいわゆる "ゼロアウト"を実行する以外に選択肢はありません。 – Lundin
[この回答](http://stackoverflow.com/questions/9535250/why-is-the-bss-segment-required/9535579#9535579)に例があります。 – Lundin
0の初期化(の一部である)からデフォルトの初期化までの質問を拡張すると、通常、アプリケーションのパフォーマンスには大きな影響はありません。ただし、コンストラクタでデータベースルックアップなどのクラスを設計するのは簡単です。したがって、アプリケーションの起動時に目立つ興味深い効果が得られます。
- 1. グローバル変数初期化の最適化
- 2. グローバル変数のC++初期化
- 3. UnityPlayerActivityグローバル初期化
- 4. 宣言時にグローバル変数の値を初期化
- 5. web.py:初期化/グローバル変数をハンドラクラスに渡しますか?
- 6. Androidでのグローバル初期化
- 7. Perlグローバル変数が初期化されていません
- 8. BehaviorSubject/Angular2で初期化されたグローバル変数での作業
- 9. グローバル変数は初期化されませんnodejs
- 10. JMeterは一度だけグローバル変数を初期化します
- 11. pythonのグローバル変数、初期化と終了
- 12. グローバル変数と初期化の宣言方法
- 13. PageLoadで再初期化されたJavaScriptグローバル変数
- 14. Python 3を使ってグローバル変数を初期化するimport
- 15. グローバル変数の初期化はいつ行われますか?
- 16. 問題グローバル変数ヘッダーファイルの配列を初期化するC++
- 17. gcc、初期化されていないグローバル変数
- 18. グローバル変数が新しいスレッドで初期化されない
- 19. グローバル変数のメモリレイアウトを初期化する
- 20. Cで変数を使用してグローバルを初期化
- 21. 列挙C、グローバル変数エラー:変数は初期化が、不完全型
- 22. グローバル変数を0にリセット
- 23. Pythonによるグローバル変数の作成、初期化後の値の変更
- 24. C++クラスをグローバルに初期化する
- 25. TCP/IP、非同期呼び出しで初期化するグローバル変数
- 26. 変数の初期化
- 27. 初期化変数は
- 28. スモールトーク初期化変数
- 29. GUID変数の初期化
- 30. thread_local変数の初期化
通常、静的な記憶期間を持つ変数は、実行可能ファイルの '.DATA'ブロックに入れられ、コード生成時にゼロになります。だから私の知る限りでは答えは「いいえ」です。実際、私は歴史的にこれが、静的な記憶期間を持つ変数がゼロ初期化されている理由だと思います。なぜなら、これはペナルティがないからです。 – Rostislav
@Rostislavローダーが 'memcpy(loading_address、address_of_data_section_with_zeroes、size_of_data_section)'のようなものを実行しているということですか? – Dean
@Rostislav、あなたは間違っています、あなたは非常に重要な点を欠いています - 非ポッドのデフォルト初期化。 – SergeyA