c++ - 为什么 C++ 使用 32 位寄存器存储 8 位值
问题描述
我尝试了以下 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
?
为什么 djgppAL
只使用?
是性能问题吗?
如果是这样,将 32 位寄存器用于 8 位值会导致什么样的性能问题?
解决方案
在 AMD 和最近的 Intel 处理器上,加载部分寄存器需要整个寄存器的先前值,以便将其与加载的值组合以产生新的寄存器值。
如果写入完整的寄存器,则不需要旧值,因此,通过寄存器重命名,可以在寄存器的先前写入之前完成。
推荐阅读
- c# - 将 C# 类强制转换为他的子类
- css - 在除一列之外的所有角度表中禁用自动缩放
- c# - Sys.WebForms.PageRequestManagerTimeoutException: Sys.WebForms.PageRequestManagerTimeoutException: 服务器请求超时
- python - 超集。通过电子邮件发送报告时出错
- javascript - 从 axios promise 接收数据后的动态离子选择选项
- react-native - 一种突出显示的方法
react-native 中的组件? - azure - 安装 Azure 模块
- python - 在拉丁超立方体中获取多样性的属性错误
- javascript - 为什么我不能使用 https 连接到我的本地主机?
- python - python中的锚点布局 - kivy