函数属性应该放在哪里?

Where should function attributes go?

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

header 示例:

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

源文件示例:

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

另外,declaration/definition中的哪个位置应该是:

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

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