一个新的基本上是一个包装的malloc。允许编译器随意使用 stdio 函数,例如,如果您尝试实现自己的 memcpy,您会得到一些奇怪的递归。如果编译器看到您复制的数量超过一定数量(比如一个愚蠢的逐位复制构造函数),它将使用 memcpy。
所以是的,new 是一个谎言,new 的意思是“分配一些内存并在那里构造一些东西,让我把它写成一个东西”,如果你分配一个浮点数组,说它们是未初始化的,可能会直接使用 malloc。
请注意,我可能会说,我不确定这些天它们是否设置为零:P
无论如何,所有编译器优化('除了复制省略和其他返回值优化的东西——但这是唯一的例外)对你来说都是不可见的,这就是重点。该程序无法判断它是否已优化,您必须对其进行计时。例如:
(x*10)/2
如果编译器不知道 x 的范围,这将不会被优化,因为 x*10 可能会溢出,但 x*5 可能不会。所以如果它优化它会改变结果。
if(x>0 && x<10) {
(x*10)/2
}
将变为 x*5 因为编译器非常聪明(远不止于此)看到“x*10 不可能溢出,所以 x*5 是安全的。”
如果您定义了全局 new/delete,则编译器无法优化,因为它不知道这样做不会产生任何影响。如果你定义你自己的一切,它“简化”到 malloc/free 将会消失。
笔记:_
我故意忽略了 malloc 和类型安全的东西。这不相关。
编译器假定 malloc、free、memcpy 等都是超级优化的,并且仅在安全的情况下使用它们 - 如上所述。邮件列表中有一个 GCC 线程,在某处我了解到 memcpy 的东西。