Gcc 编译器优化函数内联
Gcc compiler optimization function inlining
gcc 是否在函数签名中添加属性?
如果在同一个源文件中,这些函数会被编译吗?
void*__attribute__ ((noinline)) GetCurrentIp(void) {
some code...
}
void*GetCurrentIp(void);
void*__attribute__ ((always_inline)) GetCurrentIp(void)
不,不是。属性未添加到函数签名中,因此您将收到 error: redefinition of 'GetCurrentIp'
主要原因是函数签名是语言的特征(在本例中为C
),而不是帮助您匹配它们的实现(在本例中为gcc
)的特征在表达式中,所以那里一定没有实现依赖。属性(就像你提到的那样,提示编译器永远不会内联扩展该函数)是编译器根据需要生成代码的指令。事实上,gcc
定义的属性不是语言的特征,因此 程序含义不应因包含或排除这些 .
而改变
即使问题是关于 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()
因此,该属性不是签名的一部分。
gcc 是否在函数签名中添加属性? 如果在同一个源文件中,这些函数会被编译吗?
void*__attribute__ ((noinline)) GetCurrentIp(void) {
some code...
}
void*GetCurrentIp(void);
void*__attribute__ ((always_inline)) GetCurrentIp(void)
不,不是。属性未添加到函数签名中,因此您将收到 error: redefinition of 'GetCurrentIp'
主要原因是函数签名是语言的特征(在本例中为C
),而不是帮助您匹配它们的实现(在本例中为gcc
)的特征在表达式中,所以那里一定没有实现依赖。属性(就像你提到的那样,提示编译器永远不会内联扩展该函数)是编译器根据需要生成代码的指令。事实上,gcc
定义的属性不是语言的特征,因此 程序含义不应因包含或排除这些 .
即使问题是关于 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()
因此,该属性不是签名的一部分。