C++ 编译器通常 "optimize" malloc 和 free to new 和 delete 吗?
Do C++ compilers generally "optimize" malloc and free to new and delete?
如果我正在编写 100% ANSI C 但在 .cpp 文件中编译,编译器会自动 "optimize" malloc 和免费调用 new 和 delete 吗?考虑到他们的差异,这甚至有意义吗?我不认为这是它的工作原理,但我的一个朋友说这是发生了什么。
C++ 在 c.malloc
中非常具体:
The functions calloc()
, malloc()
, and realloc()
do not attempt to allocate storage by calling ::operator new()
.
The function free()
does not attempt to deallocate storage by calling ::operator delete()
.
Do C++ compilers generally “optimize” malloc and free to new and delete?
没有.
优化是一种减少程序工作量的行为。
由于 new
和 delete
分别调用构造函数和析构函数,而 malloc()
和 free()
不调用 ,因此没有必要优化它们。
通常new
会调用malloc()
,这也补充了我上面的观点,如
PS:"I'm writing 100% ANSI C" 无论如何都不会让 C++ 编译器满意...
问题有点含糊。
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
类型的对象分配内存,并 return 指向该内存的指针;没有人初始化对象。但是有一个重要的区别。如果 malloc
不能分配内存它 return 是一个空指针。如果 operator new
无法分配内存,它会抛出类型为 std::bad_alloc
的异常(除此之外还有更多内容,但现在已经足够了)。
对于 new S
也是如此:如果无法分配内存,它会抛出异常,而 malloc
return 是一个空指针。
如果我正在编写 100% ANSI C 但在 .cpp 文件中编译,编译器会自动 "optimize" malloc 和免费调用 new 和 delete 吗?考虑到他们的差异,这甚至有意义吗?我不认为这是它的工作原理,但我的一个朋友说这是发生了什么。
C++ 在 c.malloc
中非常具体:
The functions
calloc()
,malloc()
, andrealloc()
do not attempt to allocate storage by calling::operator new()
.The function
free()
does not attempt to deallocate storage by calling::operator delete()
.
Do C++ compilers generally “optimize” malloc and free to new and delete?
没有.
优化是一种减少程序工作量的行为。
由于 new
和 delete
分别调用构造函数和析构函数,而 malloc()
和 free()
不调用 ,因此没有必要优化它们。
通常new
会调用malloc()
,这也补充了我上面的观点,如
PS:"I'm writing 100% ANSI C" 无论如何都不会让 C++ 编译器满意...
问题有点含糊。
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
类型的对象分配内存,并 return 指向该内存的指针;没有人初始化对象。但是有一个重要的区别。如果 malloc
不能分配内存它 return 是一个空指针。如果 operator new
无法分配内存,它会抛出类型为 std::bad_alloc
的异常(除此之外还有更多内容,但现在已经足够了)。
对于 new S
也是如此:如果无法分配内存,它会抛出异常,而 malloc
return 是一个空指针。