【发布时间】:2012-01-03 00:59:00
【问题描述】:
最近我在 ideone.com (gcc-4.3.4) 上运行了以下代码
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <new>
using namespace std;
void* operator new( size_t size ) throw(std::bad_alloc)
{
void* ptr = malloc( 2 * 1024 * 1024 * 1024);
printf( "%p\n", ptr );
return ptr;
}
void operator delete( void* ptr )
{
free( ptr );
}
int main()
{
char* ptr = new char;
if( ptr == 0 ) {
printf( "unreachable\n" );
}
delete ptr;
}
得到这个输出:
(nil)
unreachable
虽然new 不应该返回一个空指针,因此调用者可以依靠它,编译器可以消除ptr == 0 检查并将依赖代码视为不可访问。
为什么编译器不删除该代码?只是错过了优化还是有其他原因?
【问题讨论】:
-
“
new永远不应该返回空指针”是什么意思? 你写了operator new()!显然 your 版本确实很高兴返回一个空指针。如果你不尊重标准的规则,任何事情都可能发生。 -
是的,这个问题毫无意义。您要求编译器执行实际上会导致错误代码的优化。保留
new的默认实现,然后查看汇编输出,看看编译器是否消除了死代码。 -
@Kerren SB:我的意思是编译器应该相信标准并假设
new在任何情况下都不应该返回 null 并优化检查,如果我的代码因为我的替换返回 null 而中断 -反正这是我的错。 -
@sharptooth:
new表达式不仅仅是一个分配。我认为您无法优化整个命令链。有关详细信息,请参阅我的答案。 (如果你说void * p = ::operator new(1);,那将是一个完全不同的问题。)
标签: c++ compiler-construction new-operator compiler-optimization