static
「静的期間」を持つ変数 (キーワードと同じものではありませんが、宣言された変数にはstatic
通常静的期間があります) は、実行モデルでmain
は、呼び出されるまでに「作成」されます。「自動期間」(「スタック上」、多くの人が呼ぶように) を持つ変数は、スコープに入るまでに作成されます。明示的にd (またはスペースが などによって削減される)malloc
まで lastを介して割り当てられた変数。free
realloc
上記の重要なポイントは、「この時点で作成される」ではなく、「この時点までに」です。それがより効率的であれば、コンパイラーはそれを以前に自由に行うことができます。ブロック スコープの自動期間変数の場合、一般的に、それらすべてを 1 つの大きなエントリ ポイント スタック割り当てにまとめるのが最も安価です。現代の機械。スペースの解放は、完全に解放されるか (「関数から戻る」で実行されます)、または 1 つの命令だけで済みます (「スタック ポインターに定数を追加する」)。
C99 の可変長配列 (「VLA」) は、これを少し複雑にします。多くの場合、VLA は、囲んでいるブロックに入るたびに割り当て、ブロックから出るたびに解放する必要があります。繰り返しますが、これは一般にかなり安価です (VLA を作成するためにスタック ポインターから 1 つ減算し、VLA を破棄するために 1 つ加算します)、ブロックごとに 2 つの命令は、ブロックごとにゼロ命令よりも明らかにコストがかかります。これはまた、一部のコンパイル時の最適化をわずかに妨げます。
非標準alloca
関数を使用する場合、これも通常、スタック ポインターからの減算によって実装されます。VLA では「うまく機能しない」可能性があります。 from stack pointer" を、関数自体が開始される直前に 1 回だけ実行します。