为什么使用前缀增量运算符而不是旧编译器的后缀运算符被认为是不好的做法?根据我的理解,现代编译器优化了这一点,但旧的编译器没有。是否有一个特殊的原因,一个比另一个慢,并且它是在编译代码中保持优化的原因? 如果您能提供有关运营商和编制者的任何其他详细信息,我将不胜感激,谢谢,
答案 0 :(得分:3)
“老”你必须意味着非常老。
原因是,在真正优化之前的几天,C / Unix开发的主要系统是PDP-11和后来的VAX-11。 PDP和VAX具有预递减和后递增寻址模式。
MOVL R0, -(R1) ; Decrements R1 by 4 and move the value of R0 to that location.
MOVL (R1)+, R2 ; Move the value at R1 to R2 then add 4 to R1.
这些将是C等价于
*(--a) = b ;
b = *(a++) ;
在很少优化的时代,这些可以很容易地映射回底层的装配说明。
同时这些寻址模式不存在相反的情况:
MOVL (R0)-, R1
MOVL +(R0), R1
因此,没有硬件映射到
*(++a) = b ;
b = *(a--) ;
- (Rx)和(Rx)+寻址模式可以轻松实现向下增长的堆栈。