14

自 Visual C++ 2005 以来,Microsoft 为访问volatileC++ 标准不要求的类型提供了额外的排序保证。

C++ 标准中的任何内容实际上禁止这些保证吗? Microsoft 文档似乎是这样认为的。

请让我知道标准是否允许 Microsoft 实施的排序,并对这个错误报告进行投票:

4

2 回答 2

9

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

于 2012-10-15T16:34:01.730 回答
0

该标准要求对 volatile 对象的访问严格按照抽象机的规则进行评估,大致意思是“不优化”,但仅此而已。例如,不允许编译器在寄存器中缓存值或执行公共子表达式消除。它必须完全按照你说的去做。

因此,对于所有标准的关心,volatile都有memory_order_relaxed语义(它没有指定任何不同的东西)。当然,这并不意味着你不能实现更严格的东西。

Microsoft 编译器一直(自 2005 年以来,正如 Ben Voigt 指出的那样)被volatile视为获取/释放,这导致许多人假设“volatile == threadsafe”,这反过来导致许多文章将其转为“volatile 没用!” 和“易变是邪恶的”。

MS 建议使用 ISO 实现的可能原因是,这使得他们的编译器的行为与其他所有编译器一样,没有更多令人讨厌的惊喜。

于 2012-10-15T17:10:09.283 回答