13

スタックは実行時またはコンパイル時に割り当てられますか?
例:

void main()
{
    int x;
    scanf("%d", &x);
    int arr[x];
}
4

8 に答える 8

11

スタックは実行時に割り当てられます。ただし、可変サイズの配列を除いて、各スタックフレームのレイアウトはコンパイル時に決定されます。

于 2012-05-30T18:36:49.263 に答える
4

実行時に割り当てる必要があります。次のことを考慮してください。

void a( void )
{
    int x;
}

void b( void )
{
    int y;
    a();
}

int main( void )
{
    a();
    b();
}

a()のスタックローカルxのアドレスは、2つの呼び出し間で異なります。flashenlightsが指摘しているように、各関数のスタックフレームのレイアウトは主にコンパイル時に決定されますが、そのフレームの配置は実行時に決定されます。

于 2012-05-30T18:39:22.807 に答える
2

コンパイル時間をどのように割り当てますか?自分のマシンでコードをコンパイルしたが、自分のマシンで実行した場合、コンパイラはどのようにしてマシンのスタックにメモリを事前に割り当てることができますか?

于 2012-05-30T18:38:31.703 に答える
2

これは役立つはずです。スタックメモリは実行時に割り当てられます。

関数が呼び出された回数やwhileループが実行された回数などをコンパイラが知る方法がないため、実行時に割り当てる必要があることに注意してください。

于 2012-05-30T18:38:43.630 に答える
1

スタックは常に実行時に割り当てられます。コンパイルではなくメソッドの実行にスタックが必要です。

同様の行で

于 2012-05-30T18:35:06.580 に答える
1

他のすべての答え(一般的な場合は正しい)を補完するために、理論的には、コンパイル時にスタックを割り当てることが可能な場合があります(「割り当て」の定義によって異なります)。

具体的には、プログラムに関数ポインターや再帰がない場合は、静的分析を使用して、必要な最大スタックサイズを把握できます。実際、一部の組み込みコンパイラはまさにそれを実行します。

于 2012-05-30T18:46:22.213 に答える
0

もちろん、スタックは実行時に割り当てられます。code.ecを実行するにはスタックメモリが必要です

Cプログラムのメモリレイアウトについて説明しているこのリンクを確認してください。

于 2012-05-30T18:35:43.820 に答える
0

この素晴らしい記事をチェックしてください

http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory

これは、プログラムメモリについて説明する素晴らしい記事です。また、システムでのメモリの動作に関する同じ著者の他の記事を確認することもできます。これにより、メモリでの実際の動作についての優れた洞察が得られます。

記憶についてすべてを知りたい場合は、UlrichDraperによるこの論文を読んでみて くださいhttp://www.akkadia.org/drepper/cpumemory.pdf

お役に立てれば!

于 2012-05-30T19:47:21.267 に答える