繁体   English   中英

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

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

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

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

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

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

这个问题有点模棱两可。

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类型的异常(它的std::bad_alloc不止于此,但现在已经足够了)。

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

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

不行

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

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

通常new会调用malloc() ,这也增加了我的观点,如:: operator new(size_t)是否使用malloc()所述。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM