前两个是全球新运营商的签名。对于(很少)它的价值,operator new
用于为新表达式分配空间,例如x = new T;
,而operator new[]
用于为新表达式分配空间,例如x = new T[count];
. 它的价值“小”有一个相当简单的原因:你永远不应该使用new T[count]
,所以它的工作原理几乎纯粹是一个历史好奇心。
如果您愿意,您可以重载::operator new
和/或提供您自己的堆分配。::operator new[]
就基本要求而言,两者之间没有区别——它们都只是分配并返回一个指向所请求内存量的指针。
就目前nothrow
而言,传递给的大小operator new
总是由编译器根据对象的大小计算出来的,如果是新数组,则计算你给出的计数。因此,您在新表达式中指定的参数变成传递给的第二个参数operator new
。
为了强调一点,我在上面可能还不够清楚:operator new
(and operator new[]
) 被使用,但与新表达式分开(当你说类似的东西时,你在代码中的内容x = new T;
)。operator new
并且operator new[]
非常像malloc
- 他们只是分配“原始”内存。一个新的表达式1使用其中一个来分配原始内存,然后调用构造函数在该内存中分配一个对象(或多个,在 的情况下new T[count];
)。这两者显然是相关的,但同样显然不是真的相同。
另一个小问题:也可以有一个operator new
(或operator new[]
作为类成员。这允许您为该类分配与使用全局堆的其他类不同的内存。这对于您期望的小对象来说往往是最常见的大量分配。对于这些,全局堆通常有很多您希望避免的开销。
最后,当/如果你想分配原始内存,你也可以operator new
直接调用,如void *a = ::operator new(1234);
. 唯一常见的地方是如果您决定自己实现某种集合类(例如,如果您想要一个循环缓冲区)。