请考虑以下简单功能:
shape
我最初认为这两个函数都应编译为同一程序集,并且两者都应等效于仅调用void simple_throw(id object) {
@throw object;
}
void extra_throw(id object) {
id tmp0 = object;
id tmp1 = tmp0;
id tmp2 = tmp1;
@throw tmp2;
}
(自function arguments are autorelease
by default in ARC起),也许添加一个objc_exception_throw(object)
(自ARC isn't exception safe起,默认为泄漏)。
但事实并非如此。这是程序集(除去一些多余的绒毛和objc_retain(object)
指令;;参数:.cfi_*
):
-fobjc-arc -Ofast -fomit-frame-pointer -S
_simple_throw:
pushq %rax
callq *_objc_retain@GOTPCREL(%rip)
movq %rax, %rdi
callq _objc_retainAutorelease
movq %rax, %rdi
callq _objc_exception_throw
_extra_throw:
pushq %rbx
movq _objc_retain@GOTPCREL(%rip), %rbx
callq *%rbx
movq %rax, %rdi
callq *%rbx
movq %rax, %rdi
callq *%rbx
movq %rax, %rdi
callq *%rbx
movq %rax, %rdi
callq _objc_retainAutorelease
movq %rax, %rdi
callq _objc_exception_throw
保留simple_throw
两次,而object
保留extra_throw
5次!
这导致两个问题:
object
的最佳程序集(就保留和自动释放而言)(假设我们希望生成的代码与ARC兼容)是什么?simple_throw
中对局部变量的赋值会导致额外的保留?我倾向于认为这是一个编译器错误。