简单函数(x86-64,-O2):
__attribute__( (noinline,noclone,pure) )
uint foo() {
register const uint* _reg asm ("r15");
return *_reg;
}
此功能的汇编输出:
push r15
mov eax, [r15]
pop r15
retn
为什么要插入不需要的弹出/推送指令?
答案 0 :(得分:1)
好问题,我没有最微弱的想法,但是编译器可能只会从您的声明中看到您将使用r15
,将其保存在函数入口处并在函数退出之前恢复它。编译器没有看到你只是在读寄存器。
编译器需要通过逻辑进行扩展,以跟踪是否正在写入寄存器以决定是否必须保存寄存器,这是一个非常简单的逻辑,只能保护两条指令。