Malloc似乎比新的[]使用更少的内存

Tom*_*Tom 0 c++ memory malloc memory-management

可能有任何理由:

new X[n];
Run Code Online (Sandbox Code Playgroud)

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

X* x = reinterpret_cast<X*>(malloc(n * sizeof(X))
for(X* p = x; p != x + n; ++p)
    new (p) X();
Run Code Online (Sandbox Code Playgroud)

多个n的多个副本?

我看到了这个证据.

Ker*_* SB 5

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

见5.3.4/10:

新表达通过的空间要求的分配的功能类型的第一个参数的量std::size_t.该参数不得小于正在创建的对象的大小; 仅当对象是数组时,它可能大于正在创建的对象的大小.

Itanium ABI 特定于使用数组cookie:

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

  • `malloc`的任何实现都不会存储相同的信息吗? (2认同)