malloc(sizeof(Class1)) 是否分配与 new Class1 相同大小的内存?

does malloc(sizeof(Class1)) allocate the same size of memory as new Class1?

对于任何 class,说“Class1”

cpp标准是否保证

malloc(sizeof(Class1)) 

分配与 new 运算符分配的内存大小相同的内存?

new Class1

如果 non-array 新表达式的分配函数调用既没有省略也没有扩展,如下所述,它将调用 operator new 来分配大小参数正好等于 sizeof 的存储对象类型。 (但不适用于数组新表达式。)

但是,新表达式的分配可能会扩展为也为其他新表达式提供存储空间,在这种情况下,提供给 operator new 的参数将是新对象所需存储空间加上必要存储空间的总和用于对齐的填充。在扩展新表达式的分配为其提供存储的其他新表达式中,不会调用 operator new

此外,如果可以以另一种方式(例如在堆栈上)提供存储,则可以完全省略对分配函数的调用。


operator new 如何获得存储空间不太清楚。 operator new 程序可以定义重载和替换,并可以以任何适合它们的方式自由获取存储空间。

compiler/standard 库提供的全局 operator new 的默认实现对它如何获取内存没有任何要求。它不需要使用 std::malloc,例如

在实践中,我认为实现通常简单地使用相同大小的参数调用 std::malloc 来获取内存,至少不存在需要额外存储的额外调试机制。


所以答案取决于您确定的分配大小。如果您引用对 operator new 的调用所请求的大小,则可能没有对新表达式的唯一调用,但如果有,给它的大小参数将与 sizeof(Class1) 完全匹配。

如果您指的是给 std::malloc 的调用次数和参数,那么标准不会对 std::malloc 调用是否发生以及使用什么参数提出任何要求。

再往下说,std::malloc自己如何获取内存也完全取决于实现。当然,这在很大程度上取决于操作系统等。


除此分配外,对Class1的构造函数调用也可能导致发生更多内存分配(但不会用于存储由new本身创建的对象),这永远不会发生malloc.


除了上面提到的所有内容之外,在 as-if 规则下,还允许编译器以任何方式编译程序,只要它具有与抽象机规则相同的可观察行为(上面的解释适用)。一般分配和调用 operator new 没有可观察的 side-effect 或调用 std::malloc 具体不是可观察的行为,因此在编译的可执行文件中,它们的调用次数和调用它们的参数可能不同。特别是,如果不需要,编译器可能会完全优化对这些函数的调用。 (例如,如果分配了从未使用过的内存。)