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

时间:2012-10-15 16:24:01

标签: c++ visual-c++ c++11 language-lawyer

自Visual C ++ 2005起,Microsoft为访问volatile类型提供了额外的排序保证,这些保证是C ++标准不需要的。

C ++标准中的任何内容是否都禁止这些保证? The Microsoft documentation似乎也这么认为。

请让我知道标准是否允许Microsoft实施的订购,并对此错误报告进行投票:

2 个答案:

答案 0 :(得分:9)

只要满足标准规定的要求,当然允许实施超出所需要的范围。向volatile对象添加释放/获取语义肯定在范围内。我认为C ++委员会没有兴趣改变语义(我们刚刚开始在波特兰开始讨论C ++的新一周,现在正在讨论如何组织会议。)

答案 1 :(得分:0)

该标准要求严格根据抽象机器的规则评估对易失性对象的访问权限,这意味着大致“不优化”,但不多于此。例如,不允许编译器将值缓存在寄存器中或执行公共子表达式消除。它必须完全按照你所说的去做。

因此,对于所有标准关注,volatile具有memory_order_relaxed语义(它没有指定任何不同的标准)。当然,这并不意味着你不允许你实施更严格的事情。

Microsoft编译器总是(自2005年,正如Ben Voigt指出的那样)将volatile视为获取/释放,这导致许多人假设“volatile == threadsafe”,其中回归导致许多文章把这变成了“挥发无用!”而“挥发是邪恶的”。

MS建议使用ISO实现的可能原因是,这使得它们的编译器就像其他所有编译器一样,没有更令人讨厌的意外。