C++ 编译器通常 "optimize" malloc 和 free to new 和 delete 吗?

Do C++ compilers generally "optimize" malloc and free to new and delete?

如果我正在编写 100% ANSI C 但在 .cpp 文件中编译,编译器会自动 "optimize" malloc 和免费调用 new 和 delete 吗?考虑到他们的差异,这甚至有意义吗?我不认为这是它的工作原理,但我的一个朋友说这是发生了什么。

C++ 在 c.malloc 中非常具体:

The functions calloc(), malloc(), and realloc() do not attempt to allocate storage by calling ::operator new().

The function free() does not attempt to deallocate storage by calling ::operator delete().

Do C++ compilers generally “optimize” malloc and free to new and delete?

没有.

优化是一种减少程序工作量的行为。

由于 newdelete 分别调用构造函数和析构函数,而 malloc()free() 不调用 ,因此没有必要优化它们。

通常new会调用malloc(),这也补充了我上面的观点,如

PS:"I'm writing 100% ANSI C" 无论如何都不会让 C++ 编译器满意...

问题有点含糊。

int *ip1 = malloc(sizeof int);
int *ip2 = new int;

这两个实际上做同样的事情:在堆上创建一个未初始化的值并将其地址分配给左侧的指针。

但是:

struct S { /* whatever */ };
S *sp1 = malloc(sizeof S);
S *sp2 = new S;

这两个不一定做同样的事情。如果S有构造函数,new S会分配内存并调用构造函数malloc(sizeof S) 只会分配内存。

我提到了一个歧义。 “替换 new”还有另一种可能的含义,即使用对 operator new:

的调用
struct S { /* whatever */ };
S *sp1 = malloc(sizeof S);
S *sp2 = ::operator new(sizeof S);

从表面上看,默认情况下,这两者做同样的事情:它们在堆上为 S 类型的对象分配内存,并 return 指向该内存的指针;没有人初始化对象。但是有一个重要的区别。如果 malloc 不能分配内存它 return 是一个空指针。如果 operator new 无法分配内存,它会抛出类型为 std::bad_alloc 的异常(除此之外还有更多内容,但现在已经足够了)。

对于 new S 也是如此:如果无法分配内存,它会抛出异常,而 malloc return 是一个空指针。