前两个是全球新运营商的签名。对于(很少)它的价值,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);. 唯一常见的地方是如果您决定自己实现某种集合类(例如,如果您想要一个循环缓冲区)。