C++11是否允许(不要求)volatile关键字的发布/获取语义
Does C++11 allow (not require) release/acquire semantics for volatile keyword
自Visual C++2005以来,Microsoft为访问C++标准不要求的volatile
类型提供了额外的订购保证。
C++标准中有没有禁止这些保证?微软的文档似乎是这么认为的
请让我知道标准是否允许微软实施订购,并对这个错误报告进行投票:
/volatile:ms
文档混淆了"符合ISO"的含义
一个实现当然可以做超出所需内容的事情,只要它满足标准规定的要求。向volatile
对象添加发布/获取语义肯定在范围之内。我认为C++委员会没有兴趣改变语义(我们刚刚开始在波特兰与Herb讨论C++的新一周,讨论如何组织会议)。
标准要求对volatile对象的访问严格按照抽象机的规则进行评估,这大致意味着"不优化",但仅限于此。例如,编译器不允许在寄存器中缓存值或执行公共子表达式消除。它必须完全按照你说的去做。
因此,对于所有的标准注意事项,volatile
具有memory_order_relaxed
语义(它没有指定任何不同的内容)。当然,这并不意味着你不能执行更严格的规定。
微软编译器一直(自2005年以来,正如Ben Voigt所指出的)将volatile
视为获取/发布,这导致许多人认为"volatile==threadsafe",而这反过来又导致许多文章将其变成"volatile无用!"answers"volatible是邪恶的"。
MS建议使用ISO实现的可能原因是,这使得他们的编译器的行为与其他编译器一样,没有更多令人讨厌的意外。
相关文章:
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 何时在引用或唯一指针上使用移动语义
- 如何确保C++函数在定义之前声明(如override关键字)
- 如何从具有移动语义的类对象中生成共享指针
- Boost Spirit,获取迭代器内部语义动作
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 谷歌模拟和覆盖关键字
- 在C++17中,引用const字符串的语义应该是什么
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- Xcode 语义问题引用或以前定义的代码
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- C++11是否允许(不要求)volatile关键字的发布/获取语义
- C++语法/语义问题:对Function和typedef关键字的引用
- 与register关键字关联的其他语义