Rust具有128位整数,这些整数用数据类型表示i128(u128对于无符号整数):
let a: i128 = 170141183460469231731687303715884105727;
Run Code Online (Sandbox Code Playgroud)
Rust如何使这些i128值在64位系统上工作?例如,如何对这些进行算术运算?
据我所知,既然该值不能容纳在x86-64 CPU的一个寄存器中,那么编译器是否会以某种方式使用2个寄存器i128?还是他们改用某种大整数结构来表示它们?
在/O2(发布)模式下查看由Visual Studio(2015U2)生成的程序集时,我看到这个"手动优化"的C代码被转换回乘法:
int64_t calc(int64_t a) {
return (a << 6) + (a << 16) - a;
}
Run Code Online (Sandbox Code Playgroud)
部件:
imul rdx,qword ptr [a],1003Fh
Run Code Online (Sandbox Code Playgroud)
所以我想知道这是否真的比按照它的编写方式更快,类似于:
mov rbx,qword ptr [a]
mov rax,rbx
shl rax,6
mov rcx,rbx
shl rcx,10h
add rax,rcx
sub rax,rbx
Run Code Online (Sandbox Code Playgroud)
我总是觉得乘法总是比几个班次/加法慢?现代英特尔x86_64处理器不再是这种情况吗?