优化编译器可以重新安排内存访问,CPU可以不按顺序执行指令。
问题是:用逗号运算符分隔语句是否保证了执行的确切顺序?或者唯一的方法是使用内存屏障(这是非常棘手和非标准的)?
如果不能,那么对于逗号分隔语句的执行顺序究竟是什么呢?
答案 0 :(得分:7)
逗号运算符保证在一个线程内表达式右侧之前计算表达式的左侧。但是,当结果存储到存储器中时,与评估顺序完全无关,并且需要某种形式的同步,例如,记忆障碍。
答案 1 :(得分:3)
不,它不会。执行顺序(由其他线程测量)由旨在保证执行顺序的工具保证。逗号运算符用于丢弃第一个表达式的值,并且用途有限。
“似乎”规则在这里是王道,在没有障碍的情况下,它被解释为单线程背景。
答案 2 :(得分:3)
逗号运算符与简单的两个语句没有区别;在这方面
语言指定运算符的语义,但编译器/ CPU可以选择实现它的方式。如果他们可以无序地做事,他们就可以自由,只要他们可以证明结果与有序相同。他们经常这样做。
如果由于某种原因需要保证实际订单,那么您必须检查编译器和CPU文档以了解如何强制执行。这可能意味着关闭优化,使用额外的关键字,如volatile
,使用内存栅栏等。但是,除非你绝对肯定需要按顺序,让编译器和CPU做他们的事情,并给你额外的性能,没有额外的费用给你。