mcz*_*nek 6 c++ assembly integer-division modulus
我听说当处理器执行 / 或 % 时,它将执行相同的操作,但以一种方式返回商,另一种方式返回余数。
是否可以在一次操作中同时获得两者?也许如果我加入一段汇编代码(我从未做过)?
是的,编译器会为你做这件事。只需使用除法后跟具有相同操作数的余数。
https://godbolt.org/z/oK4f4s
void div(int n, int d, int *q, int *r)
{
*q = n / d;
*r = n % d;
}
div(int, int, int*, int*):
mov eax, edi
mov r8, rdx
cdq
idiv esi
mov DWORD PTR [r8], eax
mov DWORD PTR [rcx], edx
ret
Run Code Online (Sandbox Code Playgroud)
是否可以在一次操作中同时获得两者?
不,C++ 中没有这样的运算符。标准库中有一个函数可以执行这两种操作:std::div
但这没关系。在 C++ 中有一个或两个操作并不意味着 cpu 必须执行那么多操作。一个不错的优化器将能够将两个操作转换为一条指令(假设目标 CPU 可以实现)。