[英]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?
不行
优化是一种减少程序工作量的行为。
由于new
和delete
分别调用构造函数和析构函数,而malloc()
和free()
则没有 ,因此优化它们没有意义。
通常new
会调用malloc()
,这也增加了我的观点,如:: operator new(size_t)是否使用malloc()所述。
PS:“我正在编写100%ANSI C”不会以任何方式使C ++编译器感到高兴...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.