【问题标题】:Where should function attributes go?函数属性应该去哪里?
【发布时间】:2020-06-08 09:37:54
【问题描述】:

假设我想用[[gnu::cold]]; 标记一个非内联函数,该属性应该放在标题中的声明中,还是应该与源文件中的定义一起使用?假设我不会使用 LTO,只是希望针对二进制大小而不是执行速度优化特定函数。

标题示例:

[[gnu::cold]] void rarely_called_func();

源文件示例:

[[gnu::cold]] void rarely_called_func() { ... }

另外,它应该在声明/定义中的哪个位置:

/* A */ int /* B */ func () /* C */;

【问题讨论】:

  • 这对我来说似乎不是一个 C 问题...
  • @AnttiHaapala GCC 绝对允许 C 函数具有自定义属性。
  • 不是那种语法。
  • @AnttiHaapala 很好,假设我写了__attribute__((cold))
  • gcc 和 clang 支持该格式作为扩展,并且默认情况下将在 gcc 中为 C2X 启用。

标签: c++ c gcc optimization attributes


【解决方案1】:

除非编译器看到该属性,否则它不能在其优化中使用该属性。如果您不将属性放在声明中,那么编译器将看不到该属性。结论:为了让编译器使用属性进行优化,你必须把属性放到函数的声明中(在头文件中)。

【讨论】:

  • __attribute__((cold)) 似乎也适用于定义,如果你把它放在函数名之前。
  • @HolyBlackCat 嗯,很奇怪。我删除了关于那个的段落。
  • 你是如何做到这一点的?无论我使用哪种语法,我似乎都没有收到错误或警告。我在 linux x86-64 上使用 GCC 7.4 对此进行测试。
  • @KevinZ 看来not allowed on a function-definition 错误只是语法的一个特殊性。
  • @eerorika 我刚刚更新了我的问题,还有更多问题。我发现当我使用位置 (A) 时没有为“定义属性”生成警告,当我使用位置 (B) 时会出现一些警告,当我使用位置 (C) 时会出现所有警告。
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多