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



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

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

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

  1. 适用于其他常见实现
  2. 详尽
  3. 由C++标准的某些部分保证

上下文是我想替换全局新建/删除,并且想知道如果我这样做,我会错过哪些分配。

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

1. True for other common implementations
2. Exhaustive
3. Guaranteed by some part of the C++ standard

我想说的是,您无法从该列表中(我想是"备注"部分中给出的列表)中真正判断出除了MS之外还会使用哪些其他C++实现。

C++实现可以任意使用操作系统提供的任何系统调用。所以你所有 3 个问题的答案都是:不。

至于在编译器 ABI 的C++特定部分的实现中使用 malloc() vs new()
我认为您可以假设C++特定的实现new()或放置新用于任何分配器实现。
如果列出的这些方法使用new()(最不可能)或内部malloc()来分配内存,则对于C++标准库实现的用户来说无关紧要。

注意:
如果您从计划覆盖new()的背景提出要求,或者使用放置 new 为程序上下文中的所有内存分配提供您自己的内存分配机制:这不是要走的路!
您必须提供自己的malloc()版本,free() et。那么。例如,当将 GCC 与 newlib 结合使用时,您可以使用适当的存根。

一个新的基本上是一个包裹的malloc。编译器可以随意使用 stdio 函数,例如,如果您尝试实现自己的 memcpy,您会得到一些奇怪的递归。如果编译器看到你复制超过一定数量(比如一个愚蠢的逐位复制构造函数),它将使用 memcpy。

所以是的,new 是一种谎言,new 意味着"分配一些内存并在那里构造一些东西,让我把它写成一件事",如果你分配一个浮点数组,比如说,它们是未初始化的,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-safey的东西。这无关紧要。

编译器假设malloc,free,memcpy等都是超级优化的,并且只会在安全的地方使用它们 - 如上所述。在邮件列表的某个地方有一个GCC线程,我在那里了解到memcpy的事情。

Calloc 和 malloc 比 new 和 delete 低得多。首先,malloc 和 calloc 是不安全的,因为你在类型上使用任何你想要的强制转换,并且该内存中的数据访问是不受控制的。(你最终可能会写在别人的记忆上)如果你正在做一些真正的低级编程,你将不得不使用malloc和calloc。如果您是普通程序员,只需使用new并删除它们就容易得多。为什么需要精准实施?(我不得不说实现取决于,因为有很多不同的)

相关内容

  • 没有找到相关文章

最新更新