1

new/delete ではなく malloc/free を呼び出すのは、標準 C++ のどの部分ですか?

この MSDN 記事には、new/delete ではなく malloc/free が呼び出されるいくつかのケースがリストされています: http://msdn.microsoft.com/en-us/library/6ewkz86d.aspx

このリストが次のとおりかどうかを知りたいです (良い順、可能性の低い順):

  1. 他の一般的な実装に当てはまります
  2. 網羅的
  3. C++ 標準の一部によって保証されています

コンテキストは、グローバルな新規/削除を置き換えたいということであり、そうするとどの割り当てを見逃すのか疑問に思っています。

4

3 に答える 3

1

new は基本的にラップされた malloc です。コンパイラは stdio 関数を自由に使用できます。たとえば、独自の memcpy を実装しようとすると、奇妙な再帰が発生します。コンパイラは、一定量以上のコピーを検出した場合 (たとえば、ビットごとのコピー コンストラクターなど)、memcpy を使用します。

そうです、new は一種の嘘です。new は「メモリを割り当ててそこに何かを構築し、それを 1 つのものとして記述させてください」という意味です。float の配列を割り当てると、初期化されていないため、malloc がおそらく直接使用されます。

おそらく、最近ゼロに設定されているかどうかはわかりません:P

とにかく、すべてのコンパイラの最適化 (「コピーの省略やその他の戻り値の最適化を受け入れる - しかし、これは唯一の例外です) はあなたには見えません。それがポイントです。プログラムはそれが最適化されたことを知ることができません。タイミングなどを調整する必要があります。例えば:

(x*10)/2

x*10 はオーバーフローする可能性がありますが、x*5 はオーバーフローしない可能性があるため、コンパイラが x の範囲について認識していない場合、これは最適化されません。したがって、最適化すると結果が変わります。

if(x>0 && x<10) {
    (x*10)/2
} 

コンパイラは本当に賢いので(これよりもはるかに)、「x * 10がオーバーフローすることはあり得ないので、x * 5は安全です」と判断するため、x * 5になります。

定義したグローバルな new/delete がある場合、コンパイラは最適化できません。独自のすべてを定義すると、malloc/free に「単純化」されなくなります。

ノート:_

私は故意に malloc と型安全性を無視しました。それは関係ありません。

コンパイラは、malloc、free、memcpy などはすべて非常に最適化されていると想定し、上記のように安全な場所でのみ使用します。memcpy のことを知ったメーリング リストのどこかに GCC スレッドがあります。

于 2013-10-18T16:36:04.993 に答える
-2

Calloc と malloc は、new と delete よりもはるかに低レベルです。まず、malloc と calloc は安全ではありません。なぜなら、好きな型にキャストを使用し、そのメモリ内のデータへのアクセスが制御されていないためです。(他人のメモリに書き込んでしまう可能性があります) 本当に低レベルのプログラミングを行っている場合は、malloc と calloc を使用する必要があります。通常のプログラマーであれば、 new と delete を使用するだけで、はるかに簡単になります。なぜ正確な実装が必要なのですか? (実装はさまざまなものがあるため、依存すると言わざるを得ません)

于 2013-10-18T16:35:44.090 に答える