标准C ++的哪些部分会调用malloc / free而不是new / delete?

时间:2013-10-18 16:25:45

标签: c++ malloc free

标准C ++的哪些部分会调用malloc / free而不是new / delete?

这篇MSDN文章列出了几种情况,其中将调用malloc / free而不是new / delete: http://msdn.microsoft.com/en-us/library/6ewkz86d.aspx

我想知道这个列表是否是(按照良好的顺序和可能性的递减顺序):

  1. 对于其他常见实现
  2. 力竭
  3. 由C ++标准的某些部分保证
  4. 上下文是我想要替换全局新/删除,我想知道如果我这样做会分配什么。

3 个答案:

答案 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就可以了。为什么需要精确实施? (我必须说实施取决于因为有许多不同的)