以下代码
int foobar() {
int* i = new int;
return *i;
}
在x86-64上使用-03到
编译Clang 5.0.0foobar(): # @foobar()
ret
(https://godbolt.org/g/uCHVo8)
我理解为什么它只能返回一个未定义的值(因为新的'它返回一个未定义的值)。但为什么clang允许完全取消新的运营商;这不会改变代码的行为吗?
例如在这种情况下:
static int foobar() {
int* i = new int;
return *i;
}
int main(int argc, char** argv) {
int i = 0;
try {
for (;;) i += foobar();
}
catch (...) {}
return i;
}
Clang生成:
main: # @main
.LBB0_1: # =>This Inner Loop Header: Depth=1
jmp .LBB0_1
另一方面,GCC做了更多工作,但至少它在运算符new中做了一些alloc(?):
main:
push rbx
xor ebx, ebx
.L2:
mov edi, 4
call operator new(unsigned long)
add ebx, DWORD PTR [rax]
jmp .L2
mov rdi, rax
call __cxa_begin_catch
call __cxa_end_catch
mov eax, ebx
pop rbx
ret
a)哪个编译器是对的? b)Clang中的错误?