【发布时间】:2017-02-11 03:05:37
【问题描述】:
我从以下答案中提出了这个问题: Efficiency of postincrement v.s. preincrement in C++
我找到了这个表达式:
a = b++ * 2;
他们说,上面的b++ 可以与乘法并行运行。
b++ 如何与乘法并行运行?
我对该程序的理解是: 首先,我们将 b 的值复制到一个临时变量,然后增加 b,最后将 2 与该临时变量相乘。 我们不是乘以 b 而是乘以那个临时变量,那么它将如何并行运行?
我从另一个答案 Is there a performance difference between i++ and ++i in C++? 获得了关于临时变量的上述想法
【问题讨论】:
-
我认为他们的意思是可以在评估
a的值之后发生增量,并且a的值不必等待增量完成增量。跨度> -
我从来没有想过这个,。这个问题给了我一个新的思考维度..
-
我不能代表那些写了你链接的答案的人,但你应该看看instruction pipelining。
-
请定义“并行”。如果我们谈论的是 c++ 理论内存模型,那么操作是顺序的(并且彼此之间严格排序)。 as-if 规则可以允许指令指令重新排序以提供性能优势。指令流水线也将发挥作用,但永远不会有并行性。
-
@PaulHK:指针往往会破坏优化器的别名检测。基本上,
*b++可以更改 any 整数,除非另有明确证明。这通常会迫使编译器插入额外的负载。而且由于内存负载比普通算术昂贵得多(10x-100x),这通常是一种悲观。事实上,今天仍然可行的主要手动优化是从循环中提升指针取消引用,当您知道它不会别名其他变量时。 (C99 引入了restrict来帮助优化器解决这个问题)