如果我正在编写100%ANSI C但在.cpp文件中进行编译,编译器是否会自动“优化” malloc,并免费调用new和delete?考虑到它们之间的差异,这甚至有意义吗?我不认为这是如何工作的,但是我的一个朋友说这就是发生的事情。
答案 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并免费进行新建和删除操作?
否。
优化是一种减少程序工作量的行为。
由于new
和delete
分别调用构造函数和析构函数,而malloc()
和free()
的作用不是 ,因此对其进行优化是没有意义的
通常,new
会调用malloc()
,正如Does ::operator new(size_t) use malloc()?
PS:“我正在编写100%ANSI C”不会以任何方式使C ++编译器感到满意...