【问题标题】:Gcc compiler optimization function inliningGcc编译器优化函数内联
【发布时间】:2016-12-09 16:54:24
【问题描述】:

gcc 是否在函数签名中添加 属性? 如果在同一个源文件中,这些函数会被编译吗?

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


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

【问题讨论】:

  • 您也可以使用gcc 命令行选项-fno-inline 来获得noinline 对给定文件中所有函数的效果

标签: c gcc optimization inline compiler-optimization


【解决方案1】:

即使问题是关于 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()

所以,属性不是签名的一部分。

【讨论】:

    【解决方案2】:

    不,它没有。属性未添加到函数签名中,因此您将收到error: redefinition of 'GetCurrentIp'

    主要原因是函数签名是语言的特征(在这种情况下为C),而不是帮助您在表达式中匹配它们的实现(在这种情况下为gcc),所以有那里必须没有实现依赖。并且属性(就像您提到的那样,提示编译器永远不要内联扩展该函数)是编译器根据需要生成代码的指令。事实上,gcc 定义的属性并不是语言的特征,因此程序含义不应因包含或排除这些而改变

    【讨论】:

    • 如果属性未添加到函数签名中,为什么我会收到该错误?这不是 2 个声明和 1 个实现吗?
    • 我认为第二个声明是另一个实现(你错过了 ; 在它的末尾)。如果这是两个声明,则代码将成功编译。
    • ...Gcc\Test\main.c|3|错误:调用 always_inline 'GetCurrentIp' 时内联失败:函数不可内联|我认为这是不允许的。我认为它会监视第一个声明的属性。
    • 什么是 gcc 版本? 4.9好像可以编译了
    • rog.c:10:20: 错误:预期的声明说明符或 '...' 在 '(' token void* __atribute__((always_inline))GetCurrentIp(void);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多