c++ - 为什么C++使用32位寄存器来存储8位值

标签 c++ assembly gcc x86 cpu-registers

我尝试了以下 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/

相关文章:

algorithm - 使用多寄存器处理大量数据

c - 如何确保析构函数在其他库的析构函数之前被调用?

gcc - solaris gcc lib问题

c++ - 从 Windows 根存储中静默删除证书

将 ASM 转换为 C?

c++ - 在线组装

c++ - 如何使用 MinGW 调用 WMI

c++ - 存储函数指针

c++ - 在 QSqlQuery::addBindValue() 中为 LIKE 转义 %(百分比)

c++ - 为什么将数组视为函数参数 C++ 中的指针?