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 スレッドがあります。