排序-前在C++标准中定义为
如果A是在B之前排序的,那么A的评估将在B开始评估之前完成
还有一长串关于A什么时候被排序的规则--在B之前。
但是,从这个列表中,我发现在下一个完整表达式之前对一个完整表达式进行了排序。因为一个完整的表达式语句是一个完整的表达式,所以在下面的代码中,3/4/5是完整表达式,而1/2不是(它们是声明语句)。
int main(){
int a = 1; // 1
int b = 2; // 2
a = 10; // 3
b = 20; // 4
printf("%d %d", a, b); // 5
}那么,根据排序前的定义,编译器/CPU可以重新排序3/4吗?
我有两个答案:
看来我在这里遇到了矛盾。
更新
怎么样
int main(){
int a = 1; // 1
int b = 2; // 2
a = random_int(); // 3
b = random_int(); // 4
printf("%d %d", a, b); // 5
}发布于 2022-01-07 16:05:18
如果不能观察到重新排序,编译器只能重新排序3和4。
下面是 --一个(可以说)这样做的例子
生成的对象代码在10之前注册20。
.LC0:
.string "%d %d"
main:
sub rsp, 8
mov edx, 20
mov esi, 10
xor eax, eax
mov edi, OFFSET FLAT:.LC0
call printf
xor eax, eax
add rsp, 8
ret另一种解释是,这不是重新排序,这些表达式已经消失了。注意,现在已经没有提到1或2了。
发布于 2022-01-07 19:23:51
您不需要担心重新排序,至少只要您的程序是单线程的。
前面的关系决定了你将要看到的行为。
然后编译器可以重新排序它想要的任何东西,只要可观察的行为符合以前的顺序。
random_int()怎么样?
不管你调用什么功能,重新排序都不会影响可观察到的行为。
因为一个完整的表达式语句是一个完整的表达式,所以在下面的代码中,3/4/5是完整表达式,而1/2不是(它们是声明语句)。
如果我们分开头发,它们中没有一个是完整的表情。:P
在……里面
int a = 1; // 1
int b = 2; // 2
a = 10; // 3
b = 20; // 4
printf("%d %d", a, b); // 5全表达式是:1,2 (初始化器),a = 10,b = 20,printf("%d %d", a, b).
a = 10; (带;)是表达式语句,但不是表达式.如果删除;,它将变成一个完整的表达式。
https://stackoverflow.com/questions/70623925
复制相似问题