赋值表达式和 volatile

2023-11-21

我似乎有一个合理的理解volatiles一般来说,但有一个看似晦涩的案例,我不确定事情应该如何按照标准进行工作。我已经阅读了 C99 的相关部分以及 SO 上的十几个或更多相关帖子,但找不到这种情况下的逻辑或解释这种情况的地方。

假设我们有这段代码:

  int a, c;
  volatile int b;
  a = b = 1;
  c = b += 1; /* or equivalently c = ++b; */

Should a可以这样评价:

  b = 1;
  a = b; // volatile is read

或者像这样:

  b = 1;
  a = 1; // volatile isn't read

?

同样,应该c可以这样评价:

  int tmp = b;
  tmp++;
  b = tmp;
  c = b; // volatile is read

或者像这样:

  int tmp = b;
  tmp++;
  b = tmp;
  c = tmp; // volatile isn't read

?

在简单的情况下,比如a = b; c = b;事情很清楚。但是上面的那些呢?

基本上,问题是,当对象是易失性时,在 C99 的 6.5.16c3 中“表达式具有赋值后左操作数的值”究竟意味着什么?:

赋值运算符将值存储在由 左操作数。一项作业表达式具有左操作数的值 分配后,但不是左值。

这是否意味着额外读取 volatile 来生成赋值表达式的值?

UPDATE:

所以,这就是困境。

如果从 volatile 对象的额外读取中没有获得“赋值后的对象的值”,那么编译器会假设 volatile 对象b:

  • 能够持有任意int写入其中的值,也可能不是(例如,位 0 被硬连线为 0,这对于硬件寄存器来说并不罕见,我们应该使用易失性)
  • 在发生分配写入的点和获得表达式值的点之间不能改变(这也可能是硬件寄存器的问题)

正因为如此,如果表达式值不是从 易失性对象的额外读取中获得的,则不会产生易失性对象的值,而标准声称应该是这种情况。

这两个假设似乎都不太符合易失性对象的性质。

OTOH,如果“赋值后对象的值”是从所述易失性对象的额外隐式读取中获得的,那么使用易失性左操作数计算赋值表达式的副作用取决于表达式值是否被使用或是否被使用。完全任意,这将是一种奇怪的、意外的且记录不足的行为。


C11 澄清,这一点尚未明确。

你可以找到C11的最终草案here。你现在引用的第二句话指的是脚注111:

An assignment operator stores a value in the object designated by the left operand. An assignment expression has the value of the left operand after the assignment,111) but is not an lvalue.

脚注 111 说:

  1. 允许实现读取对象来确定值,但不要求这样做,即使对象具有 易失性限定类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

赋值表达式和 volatile 的相关文章

  • Cocoa 常量名称中的“k”代表什么[重复]

    这个问题在这里已经有答案了 可能的重复 Apple 的 API 中的 k 前缀表示什么 https stackoverflow com questions 675816 what does the k prefix indicate in
  • 寻求有关 cs50“现金”问题集的 C 贪婪算法的帮助[已关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 目标是创建一种算法 该算法接受输入并给出从输入中减去值 25 10 5 1 的次数的输出 代码需要以尽可能贪婪的方式执行此操作 尽可能获取最
  • 在 C# 中格式化 Resharper 属性的支持字段

    有没有办法控制 Resharper 放置其支持字段的位置 目前 它试图让他们在班级中名列前茅 我希望他们能去到酒店的正上方 还没有
  • asm、asm 易失性内存和破坏性内存之间的区别

    在实现无锁数据结构和定时代码时 通常需要抑制编译器的优化 通常人们使用asm volatile with memory在 clobber 列表中 但有时你会看到asm volatile或者只是一个简单的asm破坏记忆 这些不同的语句对代码生
  • 嵌套绑定表达式

    这是一个后续问题我之前的问题 https stackoverflow com questions 2735294 templates function pointers and c0x include
  • C++ 构造函数根据参数类型调用另一个构造函数

    我有这门课 class XXX public XXX struct yyy XXX std string private struct xxx data 第一个构造函数 使用结构 很容易实现 第二 我可以将一个字符串以特定的格式分开 解析
  • 如何使用 CMake 链接多个库

    我有一些与 DCMTK 相关的代码 如果我从命令行使用 g 我可以成功构建并运行它 这是代码 include dcmtk config osconfig h include dcmtk dcmdata dctk h int main Dcm
  • 减少最大值并保存其索引

    int v 10 2 9 1 3 5 7 1 2 0 0 int maximo 0 int b 0 int i pragma omp parallel for shared v private i reduction max maximo
  • 在多个线程中添加和删除时 List 中的 null 值

    我知道 C System Collections Generic List 对象不是线程安全的 但我想知道为什么这段代码会生成空值 Task Run gt for var i 0 i lt 10 i var str Test i list
  • WiX 安装程序在 vs 2012 上不起作用

    我想为我的应用程序创建一个安装程序 我已经下载了 WiX 3 6 并将其安装在 vs 2012 上 创建简单的winform应用程序 将 WiX 安装项目添加到我的解决方案中 右键单击参考并将我的 winform 应用程序添加到安装程序的参
  • boost::bind 会导致开销吗?

    我目前正在从事网络软件方面的工作 它有一个主要类 server这显然代表一个服务器实例 A server实例可以发送请求 并通过回调通知用户响应 代码如下 class server public typedef boost function
  • 作为服务运行时,URLDownloadToFile() 将对象写入缓存中

    我有一个软件 可以将图像下载到工作目录中 然后对其进行处理以创建视频 之后 这些文件将被独立脚本删除 问题是它还将文件写入以下目录 该软件作为系统服务运行 C Windows SysWOW64 config systemprofile Ap
  • 访问控制器类中的 appsettings.json 值

    无法弄清楚如何读取startup cs之外的appsettings json值 例如 我想做的是在 Layout cshtml 中 从配置中添加站点名称 例如 ViewData SiteName Configuration GetValue
  • 获取上下文菜单的控制

    我有一个如下所示的上下文菜单 A 1 2 3 选择 1 2 或 3 后 我需要访问调用上下文菜单的对象 意思是如果这是 textbox1 的上下文菜单 那么我需要访问该对象 我该怎么做 忘了说了 这是一个WPF应用程序 所以我使用 Syst
  • 是否可以使用 struct stat 描述符获取和设置文件名?

    是否可以在获取或设置 重命名 文件名时给出文件的绝对路径 并将 struct stat 实例作为 lstat 函数的参数 正如我在文档结构中发现的那样 struct stat dev t st dev ID of device contai
  • 如何打开 Outlook 已接收和阅读电子邮件

    我们有 5 个人 使用同一封电子邮件通过 Outlook 回复客户 我想设计一个程序来打开所有已发送的电子邮件 阅读它们 打开它们 找到第一个人的签名 并在他 她的计数器中添加一个数字 以便我可以得出一些统计数据 关于如何打开 Outloo
  • 成员函数的Decltype

    class A int f int x int j return 2 decltype f p 给我错误 error decltype cannot resolve address of overloaded function 我不明白为什
  • 如何在迭代时从地图中删除?

    迭代时如何从地图中删除 喜欢 std map
  • TPL架构问题

    我目前正在开展一个项目 我们面临并行处理项目的挑战 到目前为止没什么大不了的 现在来说说问题 我们有一个 ID 列表 我们定期 每 2 秒 为每个 ID 调用一个 StoredProcedure 需要单独检查每个项目的 2 秒 因为它们是在
  • Windows 安装程序 (C#) 错误代码 2869

    我在 VS 2005 中有一个项目 其中有一个控制台应用程序和一个与安装该应用程序关联的安装项目 我在控制台应用程序中还有一个安装程序类 安装项目将使用它在安装前进行一些验证 这些任务正在检查数据库连接字符串并检查某些目录位置以确保它们在安

随机推荐