分配值时,char *指针上的C ++预增量与后增量

时间:2018-09-11 08:45:38

标签: c++ pointers char post-increment pre-increment

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

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

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

c = *temp++; 

但是预增量应该更快,所以我认为:

c = *temp; 
++temp;

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

现在我不太清楚为什么以及为什么,所以如果有人愿意启发我,请这样做。

1 个答案:

答案 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体系结构(例如,可能是对管道的更优化使用)。