如何让 GCC 编译器不优化“printf”等标准库函数调用?

2023-11-26

有没有办法让 GCC 不优化任何函数调用?

在生成的汇编代码中,printf函数被替换为putchar。即使使用默认值也会发生这种情况-O0最小优化标志。

#include <stdio.h>

int main(void) {
    printf("a");
    return 0;
}

(Godbolt正在展示 GCC 9 正在做的事情,并且Clang8 保持不变。)


Use -fno-内置禁用标准 C 函数的所有替换和内联等价函数。 (这对于假设的代码的性能非常不利memcpy(x,y, 4)将编译为仅未对齐/别名安全加载,而不是函数调用。并禁用恒定传播,例如strlen字符串文字。所以通常在实际使用中你会希望避免这种情况。)

Or use -fno-builtin-FUNCNAME对于特定功能,例如-fno-builtin-printf.

默认情况下,一些常用的标准 C 函数被处理为内置函数,类似于__builtin_popcount。 printf 的处理程序将其替换为 putchar 或 put 如果可能的话。
6.59 GCC提供的其他内置函数

C 语句的实现细节如下printf("a")默认情况下,它们不被视为可见的副作用,因此它们不会被保留。您仍然可以在调用站点设置断点并单步执行函数(至少在汇编中,或者如果安装了调试符号,则在源代码模式下)。


要禁用单个函数的其他类型的优化,请参阅__attribute__((optimize(0)))在一个函数上 or #pragma GCC optimize。但要注意:

The optimize属性只能用于调试目的。它不适合生产代码。


你无法禁用all优化。一些优化是 GCC 在汇编过程中通过内部表示进行转换的方式所固有的。看禁用 GCC 中的所有优化选项.

例如,即使在-O0,GCC将优化x / 10为乘法逆元。

它仍然将 C 语句之间的所有内容存储到内存中(以实现一致的调试;就是这样-O0真正意思); GCC 没有“完全愚蠢”的模式,试图尽可能天真地将 C 音译为汇编语言。使用tcc为了那个原因。Clang and ICC with -O0比 GCC 更字面化,也是如此MSVC调试模式。

注意-g从来没有any对代码生成的影响,仅对发出的元数据有影响。 GCC 使用其他选项(主要是-O, -f*, and -m*)来控制代码生成,因此您始终可以安全地启用-g除了更大的二进制文件之外,不会损害性能。这不是调试mode(那是-O0);这只是调试symbols.

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

如何让 GCC 编译器不优化“printf”等标准库函数调用? 的相关文章

  • 使用 Unity 在构造函数中使用属性依赖注入

    好的 我在基类中定义了一个依赖属性 我尝试在其派生类的构造函数内部使用它 但这不起作用 该属性显示为 null Unity 在使用 container Resolve 解析实例后解析依赖属性 我的另一种选择是将 IUnityContaine
  • 如何读取扩展文件属性/文件元数据

    因此 我按照教程使用 ASP net core 将文件 上传 到本地路径 这是代码 public IActionResult About IList
  • std::cout 和 std::wcout 有什么区别?

    在c 中 有什么区别std cout and std wcout 它们都控制流缓冲区的输出或将内容打印到控制台 或者它们只是相似吗 它们作用于不同的字符类型 std cout uses char作为字符类型 std wcout uses w
  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 存储来自其他程序的事件

    我想将其他应用程序的事件存储在我自己的应用程序中 事件示例 打开 最小化 Word 或打开文件时 这样的事可能吗 运行程序 http msdn microsoft com en us library ms813609 aspx and 打开
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 获取 WPF 控件的所有附加事件处理程序

    我正在开发一个应用程序 在其中动态分配按钮的事件 现在的问题是 我希望获取按钮单击事件的所有事件 因为我希望删除以前的处理程序 我尝试将事件处理程序设置为 null 如下所示 Button Click null 但是我收到了一个无法分配 n
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 为什么在setsid()之前fork()

    Why fork before setsid 守护进程 基本上 如果我想将一个进程与其控制终端分离并使其成为进程组领导者 我使用setsid 之前没有分叉就这样做是行不通的 Why 首先 setsid 将使您的进程成为进程组的领导者 但它也
  • 如何在按钮单击时模拟按键 - Unity

    我对 Unity 中的脚本编写非常陌生 我正在尝试创建一个按钮 一旦单击它就需要模拟按下 F 键 要拾取一个项目 这是我当前的代码 在编写此代码之前我浏览了所有统一论坛 但找不到任何有效的东西 Code using System Colle
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • 使用 GROUP 和 SUM 的 LINQ 查询

    请帮助我了解如何使用带有 GROUP 和 SUM 的 LINQ 进行查询 Query the database IEnumerable
  • 使用 GhostScript.NET 打印 PDF DPI 打印问题

    我在用GhostScript NET http ghostscriptnet codeplex com打印 PDF 当我以 96DPI 打印时 PDF 打印效果很好 但有点模糊 如果我尝试以 600DPI 打印文档 打印的页面会被极大地放大

随机推荐

  • 如何禁用 Servlet 3.0 扫描和自动加载组件

    我们有一个应用程序不断从我们的第 3 方库加载 ServletContainerInitializer 实例 一个实例是 JerseyServletContainerInitializer 另一个实例是 SpringServletConta
  • 没有任何焦点的按键绑定

    我有一个 WPF 屏幕 有六个按钮 我想将每个与键绑定相关联 它们都是通过 MVVM 驱动的 ICommand 我目前将键绑定绑定到事件而不是实际的按钮
  • 基于 PHP 的 HTML 验证器

    我需要找到一个基于 PHP 的 HTML 如 WC3 Like 验证器 它可以查找无效的 HTML 或 XHTML 我在谷歌上搜索了一下 但很好奇是否有人使用过他们特别喜欢的 我有一个字符串中的 HTML html 我希望能够测试该页面并让
  • 使用 RPATH 构建 OpenSSL?

    我有 Ubuntu 14 04 它附带了 openssl 1 0 1f 我想安装另一个openssl版本 1 0 2 并且我想自己编译它 我将其配置如下 LDFLAGS Wl export dynamic L home myhome pro
  • 如何在 C++ 中声明接口?

    如何设置代表接口的类 这只是一个抽象基类吗 扩展答案布拉德格默里 您可能希望通过添加虚拟析构函数来对接口的纯虚拟方法列表做出一个例外 这允许您将指针所有权传递给另一方 而无需公开具体的派生类 析构函数不必执行任何操作 因为该接口没有任何具体
  • 什么是差一错误以及如何修复它?

    什么是差一错误 如果我有 我该如何修复它 An 相差一误差例如 当您打算执行循环 n 次并编写如下内容时 for int i 1 i lt n i or for int i 0 i lt n i 在第一种情况下 将执行循环 n 1 次 在第
  • Flurry 分析在 Windows Phone 7 中崩溃

    我已将 Flurry http www flurry com 集成到我的 Phone 7 应用程序中 唯一需要的代码是应用程序启动中的这一行 FlurryWP7SDK Api StartSession ApiKeyValue 但是 一旦命中
  • 是否可以在不使用 foreach 的情况下重新创建此语句? [复制]

    这个问题在这里已经有答案了 可能的重复 C 具有继承的泛型类型的 Is 运算符 是否可以在不使用 foreach 语句的情况下将类类型从 Deal 更改为 Deal Bookmark Wrapper 时将一个列表添加到另一个列表中 var
  • Java服务重启4、5次

    我正在运行 Java 服务来轮询数据库中的数据 在我的班级中 我有一个线程 它每 5 秒在数据库中查找数据 在特定时间 比如下午 6 点非工作时间 我让线程休眠到某个配置的时间延迟 问题 当我让线程休眠时 似乎我的 Java 服务已重新启动
  • 编写我自己的通用地图函数

    我正在尝试编写自己的通用程序map功能和以下是我想出的 def map A B CC X lt Traversable X That xs CC A f A gt B implicit cbf CanBuildFrom CC B That
  • 角度在 url 中的哈希之前添加斜杠

    当我尝试在 url 中添加哈希时 例如 a href whatever whatever a or window location hash whatever 它在哈希世界之前附加一个 gt www mysite com whatever
  • 使滚动条出现在 RMarkdown 代码块中(html 视图)

    我正在使用 RStudio 和 knitr 制作 RMarkdown 文档 我希望打印代码块而不在我创建的 html 文件上包装文本 我是否缺少一个停止代码文本换行的选项 到目前为止 我只发现了有关如何remove滚动条 让我觉得最近可能发
  • 当用户选择记录时,推荐使用哪种方式填充 Web 表单上的所有控件?

    我有一个 GridView 控件 它显示所有员工的列表 当用户从此列表中选择任何员工时 记录将显示在 Web 表单上 所有输入控件都预先填充了值 我想知道有什么好的方法可以做到这一点 我应该将所有输入控件绑定到任何 SqlDataSourc
  • 如何更改 Eclipse 中导航器视图的背景颜色?

    我没有找到任何选项 所以我怀疑某些视图遵循操作系统的颜色模式 我目前使用的是 OS X 似乎更改默认背景颜色也是不可能的 我想要完成的是创建一个深色背景主题 但自定义似乎只能在某些日食视图上进行 对于 eclipse 使用 gtk 的平台
  • .NET 3.5 SP1 中的 XmlSerializer 更改

    我看过很多关于 NET 3 5 SP1 中的更改的帖子 但昨天偶然发现了一篇我尚未看到的文档 我的代码在我的机器上运行得很好 从 VS msbuild 命令行等等 但它在构建服务器 运行 NET 3 5 RTM 上失败了 XmlRoot f
  • 即使应用程序被删除后也能收到推送通知 iPhone

    我在我的应用程序中实现了推送通知 它运行良好 现在的问题是 即使我从设备中删除了我的应用程序 它仍然会收到推送通知 那么 当从设备中删除应用程序时 有什么方法可以从推送通知中注销该应用程序 希望得到您的帮助 提前致谢 在苹果推送通知中有一个
  • 内容 '\/Date('')\/' 未按照 JSON 的要求以 '\/Date(' 开头并以 ')\/' 结尾

    我想向 WCF 休息服务发送一个发布请求 如您所见 Guid id id Guid NewGuid var httpWebRequest HttpWebRequest WebRequest Create http localhost 470
  • 如何仅显示条形图的轮廓 matplotlib

    我将数据绘制为条形图绘图库我试图只显示条形的轮廓 以便它显示为数据的 阶梯图 我在下面添加了我的代码以及所需输出的图像 plt bar x y align center width 0 1 edgecolor black color non
  • 在 wagtail 中使外部链接在新窗口中打开

    我最近实现了添加target blank 到这样的外部链接 hooks register after edit page def do after page edit request page if hasattr page body so
  • 如何让 GCC 编译器不优化“printf”等标准库函数调用?

    有没有办法让 GCC 不优化任何函数调用 在生成的汇编代码中 printf函数被替换为putchar 即使使用默认值也会发生这种情况 O0最小优化标志 include