对不起,如果问题听起来很愚蠢.我只是模糊地认识到数据对齐的问题,并且从未做过任何64位编程.我正在研究一些32位x86代码.它经常访问int数组.有时会读取一个32位整数.有时读两个或更多.在某些时候,我想将代码设置为64位.我不确定是否应该将此int数组声明为int
或long int
.我宁愿保持整数的宽度相同,所以我不必担心差异.虽然读取/写出与自然单词不对齐的地址可能会很慢,但我有点担心.
有时gcc使用32位寄存器,当我希望它使用64位寄存器时.例如以下C代码:
unsigned long long
div(unsigned long long a, unsigned long long b){
return a/b;
}
Run Code Online (Sandbox Code Playgroud)
使用-O2选项编译(省略一些样板文件):
div:
movq %rdi, %rax
xorl %edx, %edx
divq %rsi
ret
Run Code Online (Sandbox Code Playgroud)
对于无符号除法,寄存器%rdx
需要0
.这可以通过xorq %rdx, %rdx
但xorl %edx, %edx
似乎具有相同的效果来实现.
至少在我的机器上没有性能提升(即加速)进行xorl
了xorq
.
我实际上不只是一个问题:
xorl
并且不使用xorw
?xorl
比这更快的机器xorq
?