[解決済み] なぜ.bssセグメントが必要なのですか?
2022-04-28 09:31:11
質問事項
私が知っているのは、グローバル変数とスタティック変数が
.data
セグメント、そして初期化されていないデータは
.bss
セグメントを使用します。私が理解できないのは、なぜ未初期化の変数に専用のセグメントがあるのか、ということです。 初期化されていない変数に実行時に値が割り当てられた場合、その変数はまだ
.bss
セグメントのみですか?
以下のプログラムでは
a
は
.data
セグメントと
b
は
.bss
ということでよろしいでしょうか?私の理解が間違っているならば、訂正してください。
#include <stdio.h>
#include <stdlib.h>
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
int b[20]; /* Uninitialized, so in the .bss and will not occupy space for 20 * sizeof (int) */
int main ()
{
;
}
また、次のようなプログラムも考えてみましょう。
#include <stdio.h>
#include <stdlib.h>
int var[10]; /* Uninitialized so in .bss */
int main ()
{
var[0] = 20 /* **Initialized, where this 'var' will be ?** */
}
解決方法は?
理由は、プログラムサイズを小さくするためです。あなたのC言語プログラムが、コードとすべての定数が真のROM(フラッシュメモリ)に保存されている組み込みシステムで実行されると想像してください。このようなシステムでは、main()が呼ばれる前に、すべての静的記憶期間オブジェクトを設定するために、最初に "コピーダウン"を実行する必要があります。これは通常、次のような擬似的なものになります。
for(i=0; i<all_explicitly_initialized_objects; i++)
{
.data[i] = init_value[i];
}
memset(.bss,
0,
all_implicitly_initialized_objects);
.dataと.bssはRAMに格納されていますが、init_valueはROMに格納されているところです。もしワンセグだったら、ROMを大量のゼロで埋めなければならず、ROMサイズが大幅に増加する。
RAMベースの実行ファイルも、もちろん本当のROMは持っていませんが、同じように動作します。
また、memsetは非常に効率的なインラインアセンブラである可能性が高く、起動時のコピーダウンがより高速に実行できることを意味しています。
関連
-
C: 1を求める! + 2! + 3! + ... + n! (ループ)
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] MIPSのネストされたForループと配列の使用
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み】C/C++の"-->"演算子とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
_CRT_SECURE_NO_WARNINGS エラーメッセージ、解決方法
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] C関数から文字列を返す
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] なぜ16進数には0xがつくのですか?
-
[解決済み] C言語でファイルサイズを取得するには?[重複]する
-
[解決済み] C言語で変数はメモリのどこに格納されていますか?
-
[解決済み] コンパイル時にメモリを確保する」の本当の意味とは?
-
[解決済み] C言語で宣言され、初期化されていない変数はどうなるのでしょうか?それは値を持っていますか?