6

メモリの [割り当て解除] のコストは明確に定義されていますか? コストが使用されている特定のコンパイラに依存する場合、コストを合理的に想定できるようにメモリの[割り当て解除]を実装する一般的な方法はありますか?

コンパイラは、'new' の呼び出しが 1 回だけ実行されるように、次のコードを最適化できますか?

char * arr = NULL;
for (size_t i = 0; i < 5000000000; ++i)
{
    arr = new char[100000000]
    ... // Process things here
    delete []arr;
}
4

3 に答える 3

6

コンパイラは、ほぼ確実にこの最適化を実行できません。最下位レベルでは、ストレージの割り当てはmalloc(さらに 1 層下の OS API への) ライブラリ関数の呼び出しに要約されます。コンパイラーにとって、個々のmalloc/freeペアを除外してストレージを再利用できると想定するのは安全ではありません。それらの実装はオプティマイザーの範囲外でなければならないからです。

それとは別に、これはオプティマイザーにとって良い仕事だとは思いません。これは、プログラマであるあなたが特別な努力をしなくてもできることです。

メモリの割り当て/割り当て解除の標準化されたコストはありません。一般に、割り当て/割り当て解除時間は大きく異なる場合があります (たとえば、ユーザー空間ヒープの実装が OS カーネルのメモリ マネージャーから新しいページを強制的にフェッチする場合は、大幅に時間がかかります)。

妥当な経験則として、小さな割り当ては大きな割り当てよりも高速である可能性が高く、割り当ては割り当て解除よりも遅くなるはずです。

于 2011-04-11T18:43:36.770 に答える
0

コンパイラには、コード フラグメントを最適化するための設定がいくつかある場合がありますが (これにはいくつかのエラーがあります)、速度とサイズのどちらを最適化するかをコンパイラに伝える必要があります。要求される性能の程度を示す規格には何もありません。

コンパイラに依存したくないので、割り当てと割り当て解除を除外します。

また、標準 C++ 言語にはガベージ コレクションがないため、割り当てと解放によって、断片化されたメモリが混乱する (または実行が遅くなる) 可能性があります。

ところで、整数である変数「i」を浮動小数点数「5000000000.0」と比較するとエラーになります。小数点に注意してください。適切なプログラミング手法は、整数と整数、浮動小数点と浮動小数点を比較することです。

于 2011-04-11T18:44:26.777 に答える
0

char[100000000] を割り当てるための時間は、すべての要素を 0 に設定するための時間 (いずれにしてもコンストラクターが行うべきこと) に比べてはるかに短いです。また、コードが各セルに書き込む場合、割り当ては他の何よりもはるかに安価です。

そして、これを機能させ、コンストラクターのみを呼び出すコンパイラーはないと思います。

于 2011-04-11T18:49:16.560 に答える