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 架构(可能是对管道的更优化使用,例如)。
所以我知道预增量比 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 架构(可能是对管道的更优化使用,例如)。