C++编译器通常会"优化"malloc并免费使用new和delete吗?

Org*_*kin 0 c c++ malloc free compiler-optimization

如果我正在编写100%ANSI C但编译.cpp文件,编译器会自动"优化"malloc和免费调用new和delete吗?鉴于他们的差异,这甚至是否有意义?我不认为这是如何运作的,但我的一位朋友说这就是发生的事情.

Max*_*kin 5

C++非常具体c.malloc:

这些函数calloc(),malloc()并且realloc()不会尝试通过调用来分配存储::operator new().

该函数free()不会尝试通过调用来释放存储空间::operator delete().

  • 标准是否有要求?这对我来说就像一个实现细节而不是所有平台都是如此. (7认同)

Pet*_*ker 5

这个问题有点含糊不清。

int *ip1 = malloc(sizeof int);
int *ip2 = new int;
Run Code Online (Sandbox Code Playgroud)

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

但:

struct S { /* whatever */ };
S *sp1 = malloc(sizeof S);
S *sp2 = new S;
Run Code Online (Sandbox Code Playgroud)

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

我提到了一个含糊之处。“replace”还有另一个可能的含义new,那就是使用调用operator new

struct S { /* whatever */ };
S *sp1 = malloc(sizeof S);
S *sp2 = ::operator new(sizeof S);
Run Code Online (Sandbox Code Playgroud)

从表面上看,默认情况下,这两个函数执行相同的操作:它们在堆上为该类型的对象分配内存S,并返回指向该内存的指针;两者都没有初始化该对象。但有一个重要的区别。如果malloc无法分配内存,则返回空指针。如果operator new无法分配内存,则会抛出类型异常std::bad_alloc(还有更多内容,但目前差异已经足够了)。

对于 来说也是如此new S:如果无法分配内存,它会抛出异常,同时malloc返回空指针。