3

优化编译器可以重新安排内存访问,CPU 可以乱序执行指令。

问题是:用逗号运算符分隔语句是否能保证准确的执行顺序?或者唯一的方法是使用内存屏障(这是棘手的和非标准的)?

如果不会,那么逗号分隔语句的执行顺序究竟有什么保证?

4

3 回答 3

7

逗号运算符保证在一个线程中,表达式的左侧在表达式的右侧之前被计算。但是,将结果存储到内存时与评估顺序完全无关,并且需要某种形式的同步,例如内存屏障。

于 2013-10-11T22:36:52.507 回答
3

逗号运算符与简单地用 ; 分隔的两个语句没有什么不同。在这方面

该语言指定了运算符的语义,但编译器/CPU 可以选择他们希望如何实现它。如果他们可以乱序做事,他们可以自由地做,只要他们能证明结果会和有序的一样。他们经常这样做。

如果您出于某种原因想要保证实际订单,那么您必须检查您的编译器和 CPU 文档以了解如何执行它。这可能意味着关闭优化,使用额外的关键字,例如volatile,使用内存栅栏等。但是,除非您绝对需要按顺序执行,否则让编译器和 CPU 完成它们的工作并为您提供额外的性能,而不会给您带来额外的成本。

于 2013-10-11T22:48:25.697 回答
3

不,它不会。执行顺序(由其他线程测量)由旨在保证执行顺序的工具来保证。逗号运算符用于丢弃第一个表达式的值,并且用途有限。

“好像”规则在这里是王道,在没有障碍的情况下,它被解释为单线程上下文。

于 2013-10-11T22:36:22.887 回答