【问题标题】:operator new(n) versus new unsigned char[n] for placement new运算符 new(n) 与 new unsigned char[n] 用于放置 new
【发布时间】:2013-05-13 09:35:49
【问题描述】:

我正在分配内存,稍后将用于构造具有位置new 的对象。我应该使用operator new(n),还是应该使用new unsigned char[n]?为什么?

【问题讨论】:

  • 我认为两者都可以。
  • @sftrabbit:所以在对齐、语义、性能或类似方面没有区别?
  • @Mehrdad "semantics" - 确实有区别。

标签: c++ memory-management new-operator placement-new


【解决方案1】:

因素:

  • new[] 必须匹配 delete[] / new()delete
  • 他们交流不同的东西。 operator new(n) 是用于未指定目的的内存请求,而 new unsigned char[n] 松散地暗示着将字符存储在那里的意图。

数组形式可能稍微在性能/效率方面更差 - 具体细节取决于您的实现:

5.3.4/12 new T[5] 导致调用 operator new 其中 x 是一个非负的未指定值,表示数组分配开销:new-expression 的结果将从该值偏移该数量由operator new[]....返回。

顺便说一句 - 两者都没有初始化:

  • operator new()void* 返回到未初始化的内存:请参阅 3.7.4.1/2“从分配函数返回时分配的存储内容没有限制”,而 5.3.4/15 表示“新表达式创建类型 T 的对象按如下方式初始化该对象:如果省略了 new-initializer,则该对象是默认初始化的 (8.5)”; 8.5/6 说只有类类型默认构造函数提供初始化。

【讨论】:

    【解决方案2】:

    前者返回一个指向某个存储区域的指针。后者返回一个指向数组第一个元素的指针,其中包含一些 objects。如果您需要存储空间,请使用提供存储空间而不是对象的存储空间。

    【讨论】:

    • 有什么区别?他们不是都未初始化吗?还是您只是说这是一个可读性问题?
    • @Elazar No. 没有对象被初始化为operator new[n]new unsigned char[n] 默认初始化一个unsigned char 的数组(而unsigned char 的默认初始化不执行初始化)。
    • @Elazar:两者都没有初始化 - 我的回答中提供了标准参考。
    • 我很困惑,谁是 Elazar? o_O
    • @Mehrdad 某人已经删除了他们的评论。
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 2010-09-20
    • 2011-05-24
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多