标准C ++的哪些部分会调用malloc / free而不是new / delete?
这篇MSDN文章列出了几种情况,其中将调用malloc / free而不是new / delete: http://msdn.microsoft.com/en-us/library/6ewkz86d.aspx
我想知道这个列表是否是(按照良好的顺序和可能性的递减顺序):
上下文是我想要替换全局新/删除,我想知道如果我这样做会分配什么。
答案 0 :(得分:1)
new基本上是一个包装的malloc。允许编译器随意使用stdio函数,例如,如果你尝试实现自己的memcpy,你会得到一些奇怪的递归。如果编译器看到你复制的数量超过一定数量(比如一个愚蠢的逐位复制构造函数),它将使用memcpy。
所以是的,新的是谎言,新的意思是“分配一些内存并在那里构造一些东西让我把它写成一件事”,如果你分配一个浮点数组说,它们是未初始化的,malloc可能会是直接使用。
注意我可能会说,我不确定这些天他们是否已归零:P
无论如何,所有编译器优化('cept copy elisioning和其他返回值优化的东西 - 但这只是唯一的例外)对你来说是不可见的,这就是重点。该程序无法判断它是否经过优化,您必须对它进行计时和填充。例如:
(x*10)/2
如果编译器不知道x的范围,这将不会被优化,因为x * 10可能会溢出,但x * 5可能不会。因此,如果它被优化,它会改变结果。
if(x>0 && x<10) {
(x*10)/2
}
将成为x * 5,因为编译器非常智能(远不止于此)看到“x * 10无法溢出,所以x * 5是安全的。”
如果你有一个你定义的全局新/删除,编译器就无法优化,因为它无法知道如果它没有效果。如果你定义自己的一切,它“简化”到malloc / free就会消失。
注意:_ 强>
我故意忽略了malloc和type-saftey的东西。这不相关。
编译器假定malloc,free,memcpy等都是超级优化的,并且仅在安全的地方使用它们 - 如上所述。邮件列表上有一个GCC主题,我在那里学到了memcpy的东西。
答案 1 :(得分:1)
我想知道这个列表是否是(按照良好的顺序和可能性的递减顺序):
1. True for other common implementations
2. Exhaustive
3. Guaranteed by some part of the C++ standard
我说你无法从that list(我想在备注部分中给出的那个)中告诉你除了MS之外的其他C ++实现。
C ++实现可以任意使用任何OS提供的系统调用。所以你所有3个问题的答案都是:否。
在编译器ABI的C ++特定部分的实现中使用malloc()
vs new()
:
我认为您可以假设C ++特定的实现将使用new()
或者对于任何分配器实现使用placement new。
如果列出的方法在内部使用new()
(最不可能)或malloc()
来分配内存,那么对于C ++标准库实现的用户来说无关紧要。
注意:强>
如果您从后台询问计划覆盖new()
,或使用placement new为程序上下文中的所有内存分配提供自己的内存分配机制:那不是可行的方法!
您必须提供自己的malloc()
,free()
等版本。人。然后。例如。将GCC与newlib
结合使用时,可以使用适当的存根。
答案 2 :(得分:-2)
Calloc和malloc比new和delete更低级别。首先,malloc和calloc是不安全的,因为你使用任何你想要的类型转换,并且该内存中的数据访问是不受控制的。 (你最终可以写在别人的记忆中)如果你正在做一些真正的低级编程,你将不得不使用malloc和calloc。如果你是普通的程序员,只需使用new和delete就可以了。为什么需要精确实施? (我必须说实施取决于因为有许多不同的)