C++ pre-increment vs post-increment on char* pointer while assigning a value

C++ pre-increment vs post-increment on char* pointer while assigning a value

所以我知道预增量比 post-increment 快,因为没有复制值。但是假设我有这个:

char * temp = "abc"; 
char c = 0; 

现在,如果我想将 'a' 分配给 c 并递增 temp,使其现在指向 'b' 我会这样做:

c = *temp++; 

但是预增量应该更快所以我想:

c = *temp; 
++temp;

但根据我的测量,事实证明 *temp++ 更快。

现在我不太明白为什么以及如何,所以如果有人愿意开导我,请开导。

首先,由于您陈述的原因,预递增 可能 更快。但对于像指针这样的基本类型,实际上情况并非如此,因为编译器可以生成优化代码。参考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    , %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    , %rax
movq    %rax, temp(%rip)
movb    %dl, c(%rip)

除了指令的顺序不同,以及选择使用 addq 还是 leaq 作为增量,这两者之间没有真正的区别。如果您 do 在这两者之间获得(可测量的)不同的性能,那么这可能是由于特定的 cpu 架构(可能是对管道的更优化使用,例如)。