gcc编译器优化函数内联

时间:2016-08-03 19:58:25

标签: c gcc optimization inline compiler-optimization

gcc是否在功能签名中添加属性? 如果它们在同一个源文件中,这些编译得好吗?

void*__attribute__ ((noinline)) GetCurrentIp(void) {
    some code...
}


void*GetCurrentIp(void);
void*__attribute__ ((always_inline)) GetCurrentIp(void)

2 个答案:

答案 0 :(得分:2)

即使问题是关于C,我们也可以让g ++回答它(见Function Names as Strings)。

f.C

#include <stdio.h>

extern "C"
void *__attribute__((noinline)) GetCurrentIp(void)
{
    printf("signature of %s: %s\n", __func__, __PRETTY_FUNCTION__);
    return __builtin_return_address(0);
}

int main()
{
    GetCurrentIp();
    return 0;
}
> g++ f.C
> a.out
signature of GetCurrentIp: void* GetCurrentIp()

因此,该属性不是签名的一部分。

答案 1 :(得分:1)

不,它没有。属性不会添加到函数签名中,因此您将收到ü

主要原因是函数签名是语言的一个特征(在这种情况下为error: redefinition of 'GetCurrentIp'),而不是实现(在这种情况下为C),它们可以帮助您在表达式,因此必须没有实现依赖。和属性(比如你提到的那个,编译器永远不会扩展内联函数的提示)是编译器生成代码所需的指令。实际上,gcc定义的属性不是语言的特征,因此程序含义不应因包含或排除这些而改变。