ANSI C 编译器可以删除延迟循环吗?

2024-02-06

考虑 ANSI C 中的 while 循环,其唯一目的是延迟执行:

unsigned long counter = DELAY_COUNT;
while(counter--);

我已经看到这在嵌入式系统上被大量使用来强制延迟,例如。没有sleep功能和定时器或中断是有限的。

我对 ANSI C 标准的理解是,符合标准的编译器可以完全删除它。它没有任何描述的副作用5.1.2.3:

访问易失性对象、修改对象、修改文件或调用执行任何这些操作的函数都是副作用,即执行环境状态的变化。

...这一部分还说:

如果实际实现可以推断出其值未被使用并且不会产生所需的副作用(包括由调用函数或访问易失性对象引起的任何副作用),则实际实现不需要评估表达式的一部分。

这是否意味着循环可以被优化?即使counter were volatile?

Notes:

  1. 这与编译器是否允许消除无限循环? https://stackoverflow.com/questions/2178115/are-compilers-allowed-to-eliminate-infinite-loops,因为那指的是infinite循环,并且出现关于何时允许程序终止的问题。在这种情况下,程序肯定会在某个时刻越过这条线,无论是否优化。
  2. 我知道 GCC 是做什么的(删除循环-O1或更高,除非counter is volatile),但我想知道标准规定了什么。

C 标准遵从性遵循“as-if”规则,通过该规则,编译器可以生成任何行为“就像”在抽象机上运行实际指令的代码。由于不执行任何操作具有与执行循环相同的可观察行为,因此完全允许不为其生成代码。

换句话说,在真实机器上计算所需的时间并不是程序“可观察”行为的一部分,它只是特定实现的一种现象。

情况有所不同volatile变量,因为访问易失性被视为“可观察”的效果。

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

ANSI C 编译器可以删除延迟循环吗? 的相关文章

随机推荐

  • 在 Objective C (Mac OS X) 中检测 CPU 架构(32 位/64 位)运行时

    我目前正在拧一个Cocoa http en wikipedia org wiki Cocoa 28API 29需要执行一些针对 32 位和 64 位优化的 控制台 应用程序的应用程序 因此 我想检测应用程序正在运行的 CPU 架构 以便我可
  • 使用 python paramiko 进行 SSH 密钥转发

    目前 我们在桌面上运行一个脚本 使用 paramiko 来 ssh 到远程 Linux 主机 一旦我们进入远程 Linux 主机 我们就执行另一个命令来登录另一台远程计算机 我们想要做的是从 paramiko 将密钥传递到远程服务器 这样我
  • Orchard CMS 完整指南 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我目前正在 Orchard 中开发一个非常简单的网站 但这需要我用主题和内容类型 小部件来扩展它 现在这就是我所了解的 内容类型和小部件
  • QGridLayout,3 个窗格,无法正确扩展

    我正在尝试使用以下内容布局一个窗口 全部用代码表示 QGridLayout 我可以将小部件添加到布局中并将它们显示在我的窗口中 但我不知道如何正确调整它们的大小 这就是我想要的 Leftmost Center Rightmost 这些是我窗
  • 具有 Facebook 身份验证的 Azure 移动服务:获取用户信息

    我刚开始使用 Azure 移动服务 或任何移动开发人员 我已按照本教程为 Android 应用程序启用 Facebook 身份验证 http azure microsoft com en us documentation articles
  • 如何绕过java.nio.file.DirectoryNotEmptyException? [复制]

    这个问题在这里已经有答案了 有没有办法绕过java nio file DirectoryNotEmptyException 我希望能够删除其中包含内容的文件夹 有没有办法绕过java nio file DirectoryNotEmptyEx
  • PHP 类。如何构建将数据保存到数据库的方法

    我正在构建一个类来将数据保存到数据库 但我不知道如何处理这个问题 我的项目文件夹是这样的 Lib Models Uddt person php uris php Main class php Example usage php Models
  • 具有最大并发数的异步并发队列

    我遇到了一个自定义异步队列的错误 该队列一次调用 10 个异步函数 我正在启动包含 50 个作业的队列 一旦前 10 个作业完成 队列就会移动到后面的 10 个作业 直到完成所有作业 我遇到的错误是 一旦完成 50 个作业 它就会重新启动前
  • Linux 删除超过 1 年的文件夹和超过 3 个文件

    我正在编写一个 ant 脚本来清理存档文件夹 以下是我需要清理的方法 我需要删除超过一定天数的旧文件夹 并且其中包含超过 3 个文件 例如 如果某个文件夹已有 300 天的历史 但只有 3 个文件 则该文件夹不会被删除 我知道我可以通过 s
  • 使用记录 Haskell 进行泛型派生

    我基本上是想看看是否可以在 Haskell 中模拟 ORM 框架 这样如果用户想要创建数据库模型 他们会做这样的事情 data Car Car company String model String year Int deriving Mo
  • 从小部件启动/停止服务

    我想从小部件内部启动一项服务 我知道我可以使用 PendingIntent 来做到这一点 例如 PendingIntent intent PendingIntent getService context 0 new Intent conte
  • npm install 不能与 --prefix 一起使用

    看起来npm install prefix server 没有参数 不适用于 prefix旗帜 我只想安装 package json 中的所有软件包 该命令后我得到的只是 npm WARN enoent ENOENT 没有这样的文件或目录
  • HttpClient的默认最大连接数是多少

    HttpClient 是否使用与 HttpWebRequest 相同的 ServicePoint 连接限制 Thanks 答案并不完整 这取决于实施 在 net核心中ServicePointManager DefaultConnection
  • 在单独的程序集中使用 View 组件进行 ASP NET 5 本地化

    我有一个 类库 项目 上面有一些 ViewComponents 我已经让它们在我的 MVC 6 Web 应用程序 上工作 感谢这个问题 https stackoverflow com questions 34236850 asp net m
  • 如何使用 Python 解码 Angular 的自定义 HTML 编码

    我想抓取并解析伦敦证券交易所新闻文章 https www londonstockexchange com news article ESNT date for fy 2020 results announcement 14850033 网站
  • 如何获取 razor 视图引擎中集合中项目的元数据?

    我有一个项目写在C 位于 ASP NET MVC 5 框架的顶部 我试图将我的视图与视图模型分离 以便我可以使我的视图可重用 随着大量使用EditorTemplates我能够通过评估来创建所有标准视图 即创建 编辑和详细信息 ModelMe
  • 对大于 RAM 大小的数据进行排序

    这是谷歌面试问题 给定 2 台机器 每台机器都有 64 GB RAM 包含所有整数 8 字节 对整个 128 GB 数据进行排序 您可以假设有少量额外的 RAM 扩展此功能以对存储在 1000 台机器中的数据进行排序 我想出了外部排序 我们
  • Strongloop/loopback - 维护多个版本的 API

    我是第一次使用strongloop loopback 有一些基本的指导online https docs strongloop com display public LB Versioning your API用于 API 版本控制 var
  • 具有属性的 UML 建模枚举

    我想使用 Java 枚举 enum 创建一个 UML 图 它具有一个或多个属性 但我对如何做到这一点感到困惑 例如 可以这样声明枚举 public enum Enumeration type LITERAL A attr1 value at
  • ANSI C 编译器可以删除延迟循环吗?

    考虑 ANSI C 中的 while 循环 其唯一目的是延迟执行 unsigned long counter DELAY COUNT while counter 我已经看到这在嵌入式系统上被大量使用来强制延迟 例如 没有sleep功能和定时