9

私は次のCコードを持っています:

   //declared at the beginning of the CAStar.c file:
    int TERRAIN_PASSABLE = 1;
    int TERRAIN_IMPASSABLE = 0;
    int TERRAIN_SOME_WHAT_PASSABLE = 2;

これらの変数のいずれかについて、値がゼロ以外の場合、「nm」コマンドによってタイプ「D」(初期化) として報告されることに気付きました。

_TERRAIN_PASSABLE          |00000008|   D  |
_TERRAIN_SOME_WHAT_PASSABLE|00000004|   D  |

ただし、0 に初期化されたものは "B" (初期化されていない) として報告されます。

_TERRAIN_IMPASSABLE        |00000000|   B  |

「0 で初期化」と「0 以外で初期化」の違いはなぜですか?

4

2 に答える 2

5

これは多かれ少なかれ、BSS がどのように機能し、どのように使用されるかについてです。B は、変数が BSS セクションに配置されることを意味します (初期化されていないデータ セクションであることは間違いありません)。D は、シンボルが初期化されたデータ セクションに配置されることを意味します。

たとえば、この記事を読んで、BSS がどのように機能し、何に使用されるかについてもう少し詳しく知ることができます。

于 2013-12-10T10:19:17.590 に答える
4

ほとんどの場合、これらの変数はファイル スコープで宣言され、静的なストレージ期間が与えられます。

静的ストレージ期間を持つすべての変数は、最適化の目的で、コンパイラ/リンカーによって 2 つのカテゴリに分類されます: 0 に初期化されるか、別のものに初期化されます。ゼロに初期化された変数は通常 と呼ばれるメモリ セグメントに配置され、.bss別の値に初期化された変数は に配置され.dataます。

これは、.bss変数が隣接するメモリに割り当てられている場合、変数をより高速に初期化できるためです。基本的に、それらは単一の で初期化されますmemset。また、必要な ROM の量も削減されます。関連する質問と詳細。

編集

.bss 変数が初期化されていない状態になる理由は、C 言語 (C11 6.7.9/10) に、プログラマーによって明示的に初期化されていないすべての静的ストレージ期間変数 (それらは「初期化されていない」) であるという規則があるためです。 )、ゼロに初期化する必要があります

于 2013-12-10T10:20:38.773 に答える