C ++编译器是否通常会“优化” malloc并免费使用new和delete?

时间:2018-11-27 15:15:24

标签: c++ c malloc compiler-optimization free

如果我正在编写100%ANSI C但在.cpp文件中进行编译,编译器是否会自动“优化” malloc,并免费调用new和delete?考虑到它们之间的差异,这甚至有意义吗?我不认为这是如何工作的,但是我的一个朋友说这就是发生的事情。

3 个答案:

答案 0 :(得分:5)

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

  

函数calloc()malloc()realloc()不会尝试通过调用::operator new()来分配存储。

     

函数free()不会尝试通过调用::operator delete()来取消分配存储空间。

答案 1 :(得分:3)

这个问题有点含糊。

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类型的对象分配内存,并返回指向该内存的指针;没有人初始化该对象。但是有一个重要的区别。如果malloc无法分配内存,它将返回空指针。如果operator new无法分配内存,它将引发类型为std::bad_alloc的异常(不止于此,但现在已经足够了)。

new S也是如此:如果无法分配内存,则会抛出异常,而malloc返回空指针。

答案 2 :(得分:1)

  

C ++编译器是否一般会“优化” malloc并免费进行新建和删除操作?

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

由于newdelete分别调用构造函数和析构函数,而malloc()free()的作用不是 ,因此对其进行优化是没有意义的

通常,new会调用malloc(),正如Does ::operator new(size_t) use malloc()?

所述,这也增加了我的观点。

PS:“我正在编写100%ANSI C”不会以任何方式使C ++编译器感到满意...