【发布时间】:2020-04-01 09:47:47
【问题描述】:
我有一个头文件,其中包含许多包装事物的静态函数。
namespace jhelper {
static void __attribute__((noinline)) writerKey(rapidjson_writer * writer, const char * key)
{ writer->Key(key); }
}
为什么?因为writer->Key() 会导致生成大量的asm。 writerKey 用于模板化函数,如果 writer->Key()(和类似函数)没有被包装,我的可执行文件的大小会增加几兆字节。
gcc 可以很好地处理这个问题,但是 clang 喜欢发送以下警告:
jsonVisitor.hpp:368:41: warning: 'static' function 'writerKey' declared in header file should be declared 'static inline' [-Wunneeded-internal-declaration]
我非常明确地不希望这个内联。我不担心存在于单独编译单元中的静态函数的重复副本,因为我正在使用合并版本进行发布。如何抑制此警告?干杯!
【问题讨论】:
-
static inline void __attribute__((noinline)) writerKey(/*..*/)是否解决了您的问题,因为inline现在与内联无关。 -
或未命名的命名空间而不是
static? -
我可以确认匿名命名空间没有任何影响 - 仍然会发出警告。我将
inlinein 放入并查看 asm 看看会发生什么 -
在 objdump 和 otool 玩过之后,我可以确认
static inline void __attribute__((noinline))不会使用clang -O3或g++ -O3内联函数。如果您将其发布为答案,我会接受。 -
当您遇到警告问题时,您应该发布您正在使用的编译器版本和编译器标志集。我尝试使用 clang9 和 -Wall -Weverything 重现此问题,但没有生成警告。
标签: c++ function static header clang