在玩优化设置时,我注意到一个有趣的现象:采用可变数量的参数(...)的函数似乎永远不会被内联.(显然这种行为是特定于编译器的,但我已经在几个不同的系统上进行了测试.)
例如,编译以下小程序:
#include <stdarg.h>
#include <stdio.h>
static inline void test(const char *format, ...)
{
va_list ap;
va_start(ap, format);
vprintf(format, ap);
va_end(ap);
}
int main()
{
test("Hello %s\n", "world");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
似乎总是会test在生成的可执行文件中出现(可能是损坏的)符号(在MacOS和Linux上以C和C++模式使用Clang和GCC进行测试).如果修改了签名test()以获取传递给的普通字符串printf(),那么-O1两个编译器都会按照您的预期向上内联函数.
我怀疑这与用于实现varargs的巫术魔法有关,但是通常这样做对我来说是个谜.任何人都可以告诉我编译器通常如何实现vararg函数,以及为什么这似乎阻止了内联?
我想创建一个神奇的宏,或任何东西,会产生这样的东西:
MAGICAL_MACRO(return_type, method_name, ...)
Run Code Online (Sandbox Code Playgroud)
应该像这样工作:
MAGICAL_MACRO(void, Foo, int a, int b)
Run Code Online (Sandbox Code Playgroud)
- >
virtual void Foo(int a, int b)
{
_obj->Foo(a, b);
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?恐怕不是.