gpt4 book ai didi

c++ - 是否确保保留对 volatile 结构的单独成员的写入顺序?

转载 作者:行者123 更新时间:2023-12-03 07:29:08 25 4
gpt4 key购买 nike

假设我有一个这样的结构:

volatile struct { int foo; int bar; } data;
data.foo = 1;
data.bar = 2;
data.foo = 3;
data.bar = 4;
是否保证所有作业都不会重新排序?
例如,在不使用volatile的情况下,显然可以允许编译器按照不同的顺序将其优化为两条指令:
data.bar = 4;
data.foo = 3;
但是对于volatile,是否要求编译器不要执行此类操作?
data.foo = 1;
data.foo = 3;
data.bar = 2;
data.bar = 4;
(例如,将成员作为独立的不相关的 volatile 实体进行处理-并进行重新排序,我可以想象它可以在foo和bar位于页面边界的情况下尝试提高引用的局部性。)
另外,答案是否与C和C++标准的当前版本一致?

最佳答案


它们不会重新排序。
C17 6.5.2.3(3)说:

A postfix expression followed by the . operator and an identifier designates a member of a structureor union object. The value is that of the named member, 97) and is an lvalue if the first expression isan lvalue. If the first expression has qualified type, the result has the so-qualified version of the typeof the designated member.


由于 data具有 volatile限定类型,因此 data.bardata.foo也是如此。因此,您要对 volatile int对象执行两个分配。并且通过6.7.3脚注136,

Actions on objects so declared [as volatile] shall not be “optimized out” byan implementation or reordered except as permitted by the rules for evaluating expressions.


一个更微妙的问题是,编译器是否可以通过一条指令将它们都分配给它们,例如,如果它们是连续的32位值,它是否可以使用64位存储来设置两者?我认为不会,至少GCC和Clang不会尝试。

关于c++ - 是否确保保留对 volatile 结构的单独成员的写入顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65295907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com