c-gcc __attribute__位置之间的差异



在为函数玩gcc __attribute__时,我注意到代码生成中存在差异,这取决于我放置属性的位置。在下面的例子中,我希望编译器不要优化我对use((的调用。

编译器:x86-64 gcc(trunk(

选项:-O3-墙壁

void  __attribute__((noinline, optimize("O0"))) use() {} 
int main () 
{
use();
}
use:
push    rbp
mov     rbp, rsp
nop
pop     rbp
ret
main:
xor     eax, eax
call    use
xor     eax, eax
ret

但是,如果我更改属性的位置,就会生成不同的代码。

void   use() {} __attribute__((noinline, optimize("O0")))
int main () 
{
use();
}
main:
push    rbp
mov     rbp, rsp
mov     eax, 0
pop     rbp
ret
use:
ret

如果我不放任何属性,我会得到:

void   use() {} 
int main () 
{
use();
}
use:
ret
main:
xor     eax, eax
ret

现在,我在gcc_Common-Function-attributes中看到的属性都存在于函数声明中,而不是定义中。我不确定我是否应该只在声明中使用它们。(因为在定义中使用它们似乎在上面的一个例子中有效(我的问题是,__attribute__的放置规则是什么?为什么上面的行为会如此?我查了gcc_Attribute-Syntax,但恐怕我不太理解它。

__attribute__是后面函数规范的一部分。您的第二个版本实际上是:

__attribute__((noinline, optimize("O0"))) int main() {
...
}

您设置的是main()函数的属性,而不是use()函数的属性。

请记住,在解析C代码时,换行符没有任何特殊意义,因此将属性与use()声明放在同一行实际上并不能使其成为其中的一部分。

最新更新