首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >内联vararg函数

内联vararg函数
EN

Stack Overflow用户
提问于 2014-08-25 16:39:00
回答 2查看 3.9K关注 0票数 19

在尝试优化设置时,我注意到一个有趣的现象:接受可变数量参数(...)的函数似乎永远不会内联。(很明显,这种行为是特定于编译器的,但我已经在几个不同的系统上进行了测试。)

例如,编译以下小程序:

代码语言:javascript
运行
复制
#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;
}

似乎总是会导致一个(可能损坏的) test符号出现在结果可执行文件中(在MacOS和Linux上的C和C++模式下使用Clang和GCC进行了测试)。如果将test()的签名修改为接受传递给printf()的普通字符串,则两个编译器都会从-O1向上内联该函数。

我怀疑这与用于实现varargs的巫毒魔法有关,但这通常是如何实现的对我来说是一个谜。有没有人能告诉我编译器通常是如何实现vararg函数的,为什么这似乎会阻止内联?

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25482031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档