我尝试了以下 C++ 代码:
void foo( ) {
char c = 'a';
c = c + 1;
}
得到以下结果x86-64 gcc 10.1 default flags
:
mov BYTE PTR [rbp-1], 97
movzx eax, BYTE PTR [rbp-1] ; EAX here
add eax, 1
mov BYTE PTR [rbp-1], al
但是!得到以下结果x86-64 djgpp 7.2.0 default flags
:
mov BYTE PTR [ebp-1], 97
mov al, BYTE PTR [ebp-1] ; AL here
inc eax
mov BYTE PTR [ebp-1], al
为什么 GCC 使用 EAX
而不是AL
?
为什么 djgpp 使用 AL
仅?
是性能问题吗?
如果是这样,使用 32 位寄存器存储 8 位值会带来什么样的性能问题?
最佳答案
在 AMD 和最新的 Intel 处理器上,加载部分寄存器需要整个寄存器的先前值,以便将其与加载的值结合起来生成新的寄存器值。
如果写入完整寄存器,则不需要旧值,因此,通过寄存器重命名,可以在上次写入寄存器之前完成。
关于c++ - 为什么C++使用32位寄存器来存储8位值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62808748/