gcc 什么时候在编译时评估函数?

2023-12-19

当我有以下代码时

int main(void) {
        printf("%zd\n", strlen("Hello World!"));

        return 0;
}

并编译它-O3, strings将显示字符串“Hello World!”二进制文件中缺少它,因为它是在编译时评估的。

如果我改用我自己的函数

static inline size_t my_strlen(const char *s) {
        const char *tmp = s;

        while (*++tmp);

        return tmp - s;
}

int main(void) {
        printf("%zd\n", my_strlen("Hello World!"));

        return 0;
}

使用相同的选项,仍然可以在二进制文件中找到该字符串。

为什么是这样?


因为它是一个优化 http://en.wikipedia.org/wiki/Optimizing_compiler标准允许的。

在某些系统上,strlen最终扩展为_builtin_strlenGCC 编译器知道这一点。在我的机器上/usr/include/x86_64-linux-gnu/bits/string.h(这是间接地包含于<string.h>) has

# define strlen(str) \
  (__extension__ (__builtin_constant_p (str)         \
                 ? __builtin_strlen (str)            \
                 : __strlen_g (str)))

那么实际上它是由 GNU 混合完成的glibc and gcc

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gcc 什么时候在编译时评估函数? 的相关文章

随机推荐

  • 如何从 Emacs 运行 iex?

    当我使用 Emacs 中的 elixir mode iex 运行 iex 时 我不断收到此警告 Warning could not run smart terminal falling back to dumb one 我认为这只是意味着我
  • zmq:多线程可以以简单的 PUSH-PULL 模式进行 PUSH

    我有两个进程 producer它通过推送消息ZMQ http www zeromq org to a consumer以简单的 拉 推 点对点模式 生产者有几个内部线程send 通过 zmq 但是 0MQ 的文档建议不要在线程之间共享套接字
  • 如何从 JAX-WS Web 服务中访问 ServletContext?

    我想通过将对象存储为 Servlet 上下文属性来在 Servlet 和 Web 服务 JAX WS 之间共享该对象 但是如何从 Web 服务中检索 servlet 上下文呢 JAX WS 通过消息上下文提供 Servlet 上下文 可以使
  • 对 log10 函数的未定义引用

    我正在使用 Eclipse Kepler 进行构建 并包括math h 但是 我收到错误 对 log10 的未定义引用 还类型uint8 t and unit32 t都没有得到解决 我已将两者都包括在内stdint h and inttyp
  • PyYAML 错误:无法确定标签“!vault”的构造函数

    我正在尝试读取具有标签的 YAML 文件 vault在里面 我收到错误 无法确定标签 vault 的构造函数 在阅读了几篇博客后 我了解到我需要指定一些构造函数来解决此问题 但我不清楚如何做到这一点 import yaml from yam
  • C# - 将控件移动到鼠标位置

    我试图让一个控件在用户单击并拖动控件时跟随光标 问题是 1 控件没有到达鼠标的位置 2 控件闪烁并飞得到处都是 我尝试了几种不同的方法来做到这一点 但到目前为止都失败了 我试过了 protected override void OnMous
  • 通过 DI 在 Spring 框架中正确使用 LOG4J

    我正在尝试使用 Log4j 作为 Spring 框架的一部分 据我了解 通过使用适当的豆子 系统应该映射一个可在代码中访问的单例实例 同时将日志记录深度自动映射到类 类似于 Log4J 的正常使用 如下所示 Logger log Logge
  • 如何修复 IndentationError:“需要缩进块”?

    我收到一个错误 IndentationError 需要一个缩进块 在第3行 answer subprocess check output home dir final 3 sh 我的代码是 import subprocess while T
  • 是否可以使用 TestCafe .meta 对象跳过从 cli 运行的测试

    我正在使用 TestCafe 来运行我的集成测试 我知道它有test skip函数 当我在本地测试并想要跳过一组我不需要 不想运行的测试时 这非常有用 但我想知道是否有办法运行所有测试 除了 test meta environmentSpe
  • Select2 不创建 name 属性

    我使用 select2 jQuery 插件创建了一个标签框 因此我使用了以下html表单代码
  • 当 UITextField 成为第一响应者时,如何使 UIScrollView 自动滚动

    我看过周围的帖子here https stackoverflow com questions 4585718 disable uiscrollview scrolling when uitextfield becomes first res
  • 使用 C++ 调整位图图像亮度/对比度

    使用 C 调整图像亮度 对比度 无需使用任何其他 3rd 方库或依赖项 图像亮度为here https web archive org web 20091229041814 http www kweii com site color the
  • 如何弹出“?123”Android键盘

    我有一个 EditText 需要根据状态处理数字和 或字母输入 在某些情况下 用户可以输入任一类型的输入 我只能使用以下命令弹出 电话 键盘setInputType InputType TYPE CLASS NUMBER 它可以工作 但不允
  • Scala 案例类和构造函数

    我发现自己编写了很多 某种 样板代码 例如说我有以下特征 trait Foo def x Int trait Bar def y Boolean def z String 然后我想要一个案例类 它的作用只不过是实现这些 case class
  • 如何为项目符号空格数字和点编写正则表达式

    我使用正则表达式来表示我的句子包含项目符号空格数字和点 1 This is sample Application 2 This is Sample java program regex s d s A z Required output T
  • 为什么“BESbewy”出现在我的网站跨度中?

    我注意到 Firebug 在主体末尾有一个带有 BESbewy 字符串的跨度 左侧和顶部带有 999 且可见性隐藏 首先想到的是我是如何被黑客攻击的 但经过一天的搜索后 我不再那么确定了 所以我开始认为这与 Google Maps API
  • 对 PDF 文件进行数字签名 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Flask-SQLAlchemy InvalidRequestError:对象已附加到会话

    我正在使用 Flask 创建一个论坛项目 并使用 Flask SQLAlchemy 管理所有用户 线程 帖子等 但是 我发现当我尝试执行 x 操作 例如编辑帖子 时 如果我尝试执行其他任何操作 例如删除帖子 则会收到 InvalidRequ
  • 在 Gtk 中,如何制作仅带有股票图标的按钮?

    我想创建一个按钮 其上带有库存 删除 图标 但没有文本 删除 如果我使用Button button new Button Stock Remove 我得到相反的结果 只有文本 没有图标 我会有很多这样的按钮 而且文字让它看起来很混乱 如何只
  • gcc 什么时候在编译时评估函数?

    当我有以下代码时 int main void printf zd n strlen Hello World return 0 并编译它 O3 strings将显示字符串 Hello World 二进制文件中缺少它 因为它是在编译时评估的 如