C++11是否允许(不要求)volatile关键字的发布/获取语义

Does C++11 allow (not require) release/acquire semantics for volatile keyword

本文关键字:关键字 语义 获取 volatile 是否 C++11      更新时间:2023-10-16

自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实现的可能原因是,这使得他们的编译器的行为与其他编译器一样,没有更多令人讨厌的意外。