【问题标题】:Malloc seemingly using less memory than new[]Malloc 使用的内存似乎比 new[] 少
【发布时间】:2013-05-17 17:53:33
【问题描述】:

有什么原因吗:

new X[n];

与以下相比会消耗更多内存:

X* x = reinterpret_cast<X*>(malloc(n * sizeof(X))
for(X* p = x; p != x + n; ++p)
    new (p) X();

对于多个 n 的多个副本?

我看到了这方面的证据。

【问题讨论】:

  • 重载 `X::operator new' ??
  • 有什么证据。你是如何测量的?
  • std::vector 完全符合您的建议。实际上,您应该将 array-new 视为一种反模式。

标签: c++ memory memory-management malloc


【解决方案1】:

当然:允许 Array-new 分配 更多 内存,而不仅仅是对象的空间,而且通常会这样做。当您说delete [] x; 时,实现如何知道要调用多少个析构函数?

见 5.3.4/10:

new-expression 将请求的空间量作为std::size_t 类型的第一个参数传递给分配函数。该参数不应小于正在创建的对象的大小; 只有当对象是一个数组时,它才可能大于正在创建的对象的大小。

安腾 ABI 是 specific about the use of array cookies:

|<-- offset -->|
+--------------+----------+----------+---------+---------+
|(padding)  N  |   a[0]   |   a[1]   |   ...   |  a[N-1] |
+--------------+----------+----------+---------+---------+
^              ^
|              +---- T * a = new T[N]
|
+----  return value of `operator new(sizeof(T) * N + offset)`

【讨论】:

  • malloc 的任何实现都不会存储相同的信息吗?
  • @DavidHeffernan 这就是我的想法,但我不敢质疑 KerrekSB 的知识......
  • @DavidHeffernan:那是不同的。当然,在内部某个地方,有人会知道为给定指针分配了多少内存。但这无关紧要。内存分配器不知道对象。
  • @KerrekSB 那么需要什么额外信息呢? n 对象 -> n 析构函数,是不是很简单? (所以我怀疑它不是......)
  • @H2CO3:给定x,你怎么知道n的值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2011-02-02
相关资源
最近更新 更多