最初の質問の場合new
:例のように、コンパイラーがオペレーターに遭遇した場合:
int * pData = new int[256];
次のようなコードを効果的に出力します。
int *pData = reinterpret_cast<int*>(::operator new(256 * sizeof(int)));
// the compiler may also choose to reserve extra space here or elsewhere to
// "remember" how many elements were allocated by this new[] so delete[]
// can properly call all the destructors too!
コンストラクターを呼び出す必要がある場合は、それも発行されます(この例では、コンストラクターは呼び出されないと思います)。
operator new(std::size_t)
は標準ライブラリによって実装される関数であり、常にではありませんが、多くの場合、呼び出しに要約されmalloc
ます。
malloc
OSにメモリを要求するには、システムコールを実行する必要があります。OSアロケータは通常、より大きな固定サイズのメモリブロックで動作malloc
するため、現在のメモリを使い果たした場合にのみ、毎回この呼び出しを行う必要はありません。
2番目の質問の場合:ローカル変数の場合、それは実際にはコンパイラー次第です。この規格では、スタックについては言及されていません。ただし、ほとんどの場合、共通のOSを実行し、共通のコンパイラを使用している共通のアーキテクチャを使用しています:-)。
したがって、一般的なケースでは、コンパイラは通常、スタックを適宜調整するか、可能であればレジスタを予約することにより、すべてのローカル変数の関数呼び出しの開始時にスペースを予約します(レジスタははるかに高速であるため、推奨される選択肢です)。
次に(C ++では)、変数が検出されると、コンストラクターを呼び出します。理論的には、必要に応じてスタックを調整できますが、これは正しくて効率が悪いことを証明するために複雑になります。通常、スタックスペースの予約は単一の命令であるため、一度にすべてを予約するのが非常に最適です。