C プロジェクトでは、グローバル変数に初期値を割り当てる必要がありますか?

序文

(1)ケン兄弟は以前、コミュニケーショングループでそのような質問をしました。当時私が思ったのは、「グローバル変数には初期値を代入しなければならない」ということで、これがC言語を習った時の基礎知識ではないでしょうか?何か議論できることはありますか?
(2) しかし、RAMへの書き込みが終わった後、電源を切るとデータは消えてしまいますが、初期化されたグローバル変数はなぜRAMに保存されているのでしょうか?プログラムのストレージを詳細に分析した後、私は別のアイデアを思いつきました。
(3)
<1>皆さん、こんにちは。また毎日トピックを開きます。今日はいくつかの技術的な詳細について話しましょう。C 言語プロジェクトで、グローバル変数に何気なく初期値を代入していますか? 初期値を割り当てる場合と初期値を割り当てない場合の違いをご存知ですか? さらに、初期値を割り当てる必要があるのはどのような場合でしょうか。また、初期値を割り当てるかどうかを問わないのはどのような場合でしょうか。
<2> この件については、当面は私の意見は述べず、興味のある友人を誘って議論してください。
<3>私はかつて私の開発チームに起こった小さな話を共有します。あるとき、私がグループでコードレビューをしていたとき、主にマイクロコントローラープログラムを開発していた経験豊富な攻城ライオンが私たちと議論しました。非常に強力で、彼の提案はグローバル変数であるということです。初期値を割り当てないでください。
<4> 友達、どう思いますか? (4) 注: この記事を読む前に、明らかに RAM の電源がオフになっているとデータが失われることが
必要ですが、なぜ初期化されたグローバル変数が RAM に保存されるのでしょうか。プログラムに保存された知識を詳細に分析することで理解が得られます。そうでなければ理解できません。

この記事で実際に議論されていること

(1) まず、グローバル変数がどこに保存されているかを知る必要があります。データ ストレージには、コード セグメント定数領域静的データ領域スタックヒープの 5 つの部分があることは誰もが知っています。グローバル変数は静的データ領域に格納されます。
(2)静的データは BSS セグメントとデータセグメントに分割されますBSS セグメントは、初期化されていないグローバル変数と静的変数を格納する役割を果たします。データ セグメントには、初期化されていない、または明示的に 0 に初期化されたグローバル変数と静的変数が格納されます。

ここに画像の説明を挿入

(3)したがって、この記事で議論しようとしているのは、実際には BSS セグメントと静的データ領域のデータ セグメントの違いであることがわかります。

BSSセグメントとデータセグメントのストレージの違い

(1) 検索すると、プログラムのコンパイル時に、.bss セクション内のデータには領域が割り当てられず、データの記録に必要な領域のサイズのみが割り当てられると言う人がいます。プログラムが実行されると、.bss セグメント内のデータにメモリが割り当てられます。このようにして、メモリ空間の一部を節約でき、実行可能プログラムのサイズをさらに縮小できます
(2)混乱する人もいるかもしれませんが、録画スペースは取らないほうがいいのでしょうか?コンピューター システムの場合、スペースにアクセスするということは、実際にはそのアドレスを知っていて、この開始アドレスの数バイトにアクセスするということであることを知る必要があります。次に、プログラム内でアクセスされる開始アドレスとバイト数を知るだけで済みます。このようにして、BSS セグメントのデータが正常に保存されます。
(3) ただし、データセグメントは異なりますので、コード内でその開始アドレスとアクセスしたバイト数を記録するだけでなく、その初期値も保存する必要があります。この値は RW-Data です。

ここに画像の説明を挿入

(4) MCU の電源がオンになった瞬間に、ROM に保存されている RW-Data データ (つまり、静的データ領域のデータ セグメント) が、指定された RAM の場所にコピーされます。ただし、注意してください。ここではコピーが行われています。つまり、RW-Data データは RAM と ROM にデータのコピーを持っています。
(5) 電源投入後、プログラムが実行され、コードは ZI-Data の開始位置とアクセス空間 (つまり、静的データ領域の BSS セグメント) を認識します。したがって、これは ZI-Data のためのスペースを開くものとして理解できます。

ここに画像の説明を挿入

グローバル変数を初期化しないことの利点

(1) 上記より、初期化されていないグローバル変数が BSS セグメントに格納されていることがわかります。BSS セグメントでは、初期化された値を格納するために追加のスペースを割り当てるための ROM は必要ありません。これにより、ROM スペースを効果的に節約できます
(2) ただし、現時点では、初期化されていない変数の初期値が不明であるため、プログラムが一意のプロパティを持たなくなる可能性があります。そしてそれは、私たちが C 言語で学んだこととは反対です。
<1> C言語を初めて学ぶ場合、まず動作環境を知る必要があります。そして、ほとんどの組み込みエンジニアが使用する開発環境は何ですか。
<2> 私たちが初めて C 言語を学んだとき、私たちは皆 PC 上で直接 C 言語を実行していました。そのため、数百 GB のメモリを搭載した PC に数 B のデータを保存しても意味がありません。
<3>ほとんどの組み込みエンジニアが使用する開発環境は数十 KB、場合によっては数 KB ですが、可能であれば節約できます。
<4> このとき、初期化されていない変数は不明であると誰かが言うでしょう。したがって、それは状況次第です。
(3) 私の理解では、それほど重要でない変数であれば、システム全体に特に大きな影響を与えず、後続のコードでも値が割り当てられます。初期化できません。また、自己増加または自己減少する必要があり、システムにとって特定の決定的な要因を持つ変数がいくつかあります。初期化した方が良いですよ。

おすすめ

転載: blog.csdn.net/qq_63922192/article/details/131505589