Serviceを読んで理解し、同意したものとみなします。いう本の以下の部分についての質問です。自動変数の初期化は、いわゆる「実行時」の現象であり、静的変数の初期化は、「コンパイル時」の現象なのです。言い換えれば、コンパイラは静的変数のために記憶領域を割り当て、そこに変数の初期値を格納します。したがって、プログラムが実際に実行される時、静的変数の値は既に存在しています。(略)静的変数は、それが本当に必要だと思われる場合のみに使用する事を推奨します。静的変数は、それが実際に必要でないときも、常に値をメモリ中に保存しているからです。「プログラムの実行時(a.exeをクリックした時)に1回だけメモリ上に静的変数のための記憶領域を確保する」と解釈すると、わざわざ「コンパイル時の現象」と言っている意味が分かりません。票5当該書籍は持ち合わせていないので前後の文脈はわかりませんが...これは、プログラムの実行前(a.exeをクリックする前)からメモリ上に静的変数のために記憶領域は割り当てられているという事でしょうか?そういうわけではありません。コンパイル時に静的変数に格納される内容・値は決定され、プログラム開始時に静的変数の領域は用意され、プログラム開始時に1.で決定された値で初期化されるという意味です。rand();とすると実行時に乱数を生成し、変数rndに値を格納します。変数の領域もそこに格納される値も実行時に決定されることを意味します。rand();とすることはできません。これは変数rndの値がコンパイル時に確定できないためです。個の銅バッジやはり、実行前にメモリ上に記憶領域が確保されるという訳では無いという事ですね。なると、本の「言い換えれば、コンパイラは静的変数のために記憶領域を割り当て、」は気にしない方が良さそうです。これさえ無ければこの回答と矛盾しないので。丁寧な回答有難うございました。|3常に値をメモリ中に保存しているからです。文章に「当該プログラムの実行中は」の一言を補ってください。静的変数を持つプログラムを作っただけ=実行していない状況で、あなたのコンピュータのメモリが無駄になることはありません。「コンパイル時の現象」についてはすでに説明がある通り、静的変数の初期値として採用できるのはコンパイル時に値が確定できる式だけ、という意味です。個の銅バッジ質問の書籍が入門書であり、かつ引用されている範囲の記述を読む限り、プリプロセス・狭義のコンパイル・アセンブル・リンクの各ステップの違いを分けて説明していない可能性を考慮して、ひとまとめにした広義の「コンパイル時」として説明しました。質問文で言及されていないリンク時をいきなり持ち出すのはどうかとも思いますが、とは言え例に挙げられたリンク時確定やダイナミックリックのようなロード時確定などがあるのは確かですね。11:48回答有難うございます。実行前にメモリが無駄になる意味不明な事になる訳は無いですよね。12:482大抵の場合、静的変数のアドレスというのは「ロード開始アドレス+XXXX」になります。リンク時には確定しているので、実行時に決まる「ロード開始アドレス」がわかれば静的変数のアドレスは実行の時点で確定しています。いう意味で「リンク時確定」ですね。「どの程度離れたアドレスに値を保持するか」はリンク時に決まっていたのですね。自動変数だとこれが決まっていない訳ですね。回答有難うございました。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。関連する質問3単項演算子の結合順序の意味について4コンパイル時の引数の型の不整合のチェックについて5「自動変数の配列は初期化できません」の意味が分かりません4静的型付と動的型付のメモリの動きを理解したい。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。