所以我知道,因为没有复制值,所以预增量比后增量快。但是,假设我有这个:
char * temp = "abc";
char c = 0;
现在,如果我想将'a'分配给 c 并增加 temp ,使其现在指向'b',我会这样:
c = *temp++;
但是预增量应该更快,所以我认为:
c = *temp;
++temp;
但是事实证明,根据我的测量,* temp ++更快。
现在我不太清楚为什么以及为什么,所以如果有人愿意启发我,请这样做。
答案 0 :(得分:1)
首先,由于您陈述的原因,预增量仅可能更快。但是对于诸如指针之类的基本类型,实际上并非如此,因为编译器可以生成优化的代码。参考Is there a performance difference between i++ and ++i in C++?了解更多详情。
第二,对于像样的优化编译器,您提到的两种选择之间没有区别。在两种情况下,很可能会生成完全相同的机器代码(除非您禁用了优化)。
为了说明这一点:在我的编译器上,禁用优化后会生成以下代码:
# c = *temp++;
movq temp(%rip), %rax
leaq 1(%rax), %rdx
movq %rdx, temp(%rip)
movzbl (%rax), %eax
movb %al, c(%rip)
# c = *temp;
movq temp(%rip), %rax
movzbl (%rax), %eax
movb %al, c(%rip)
# ++temp;
movq temp(%rip), %rax
addq $1, %rax
movq %rax, temp(%rip)
请注意,后者中还有一条movq
指令,可能会导致运行时间变慢。
但是,启用优化时,它变为:
# c = *temp++;
movq temp(%rip), %rax
leaq 1(%rax), %rdx
movq %rdx, temp(%rip)
movzbl (%rax), %eax
movb %al, c(%rip)
# c = *temp;
# ++temp;
movq temp(%rip), %rax
movzbl (%rax), %edx
addq $1, %rax
movq %rax, temp(%rip)
movb %dl, c(%rip)
除了指令的顺序不同,以及选择使用addq
还是leaq
作为增量之外,这两者之间没有真正的区别。如果您确实在这两者之间获得(明显)不同的性能,则可能是由于特定的cpu体系结构(例如,可能是对管道的更优化使用)。