スタックは実行時またはコンパイル時に割り当てられますか?
例:
void main()
{
int x;
scanf("%d", &x);
int arr[x];
}
スタックは実行時またはコンパイル時に割り当てられますか?
例:
void main()
{
int x;
scanf("%d", &x);
int arr[x];
}
スタックは実行時に割り当てられます。ただし、可変サイズの配列を除いて、各スタックフレームのレイアウトはコンパイル時に決定されます。
実行時に割り当てる必要があります。次のことを考慮してください。
void a( void )
{
int x;
}
void b( void )
{
int y;
a();
}
int main( void )
{
a();
b();
}
a()のスタックローカルxのアドレスは、2つの呼び出し間で異なります。flashenlightsが指摘しているように、各関数のスタックフレームのレイアウトは主にコンパイル時に決定されますが、そのフレームの配置は実行時に決定されます。
コンパイル時間をどのように割り当てますか?自分のマシンでコードをコンパイルしたが、自分のマシンで実行した場合、コンパイラはどのようにしてマシンのスタックにメモリを事前に割り当てることができますか?
これは役立つはずです。スタックメモリは実行時に割り当てられます。
関数が呼び出された回数やwhileループが実行された回数などをコンパイラが知る方法がないため、実行時に割り当てる必要があることに注意してください。
スタックは常に実行時に割り当てられます。コンパイルではなくメソッドの実行にスタックが必要です。
他のすべての答え(一般的な場合は正しい)を補完するために、理論的には、コンパイル時にスタックを割り当てることが可能な場合があります(「割り当て」の定義によって異なります)。
具体的には、プログラムに関数ポインターや再帰がない場合は、静的分析を使用して、必要な最大スタックサイズを把握できます。実際、一部の組み込みコンパイラはまさにそれを実行します。
もちろん、スタックは実行時に割り当てられます。code.ecを実行するにはスタックメモリが必要です
Cプログラムのメモリレイアウトについて説明しているこのリンクを確認してください。
この素晴らしい記事をチェックしてください
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
これは、プログラムメモリについて説明する素晴らしい記事です。また、システムでのメモリの動作に関する同じ著者の他の記事を確認することもできます。これにより、メモリでの実際の動作についての優れた洞察が得られます。
記憶についてすべてを知りたい場合は、UlrichDraperによるこの論文を読んでみて くださいhttp://www.akkadia.org/drepper/cpumemory.pdf
お役に立てれば!