执行除法和处理器模数的最佳方法是什么?

hay*_*ayj 1 c c++ processor division modulo

如何同时执行除法模数.处理器有可能吗?

喜欢 :

int a, b = 8 / 3; //a = 2, b = 2
Run Code Online (Sandbox Code Playgroud)

或者是否有比以下更好的操作:

int a = 8 / 3;
int b = 8 % 3;
Run Code Online (Sandbox Code Playgroud)

也许这更好?

int a = 8 / 3;
int b = 8 - a * 3;
Run Code Online (Sandbox Code Playgroud)

谢谢.

fre*_*low 6

考虑以下功能:

std::pair<int, int> divmod(int x, int y)
{
    return { x / y, x % y };
}
Run Code Online (Sandbox Code Playgroud)

通过g++ -std=c++11 -O1 -S吐出以下汇编代码来编译它:

movl    %edi, %eax
cltd
idivl   %esi
salq    $32, %rdx
movl    %eax, %eax
orq     %rdx, %rax
ret
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它在第3行只包含一个分区.优化器非常擅长这个东西.


Kon*_*lph 5

也许这更好?

为什么会这样?它对程序员和编译器/优化器来说都很模糊.在没有查看编译器输出的情况下,我想任何体面的优化器都会看到你的第一个代码并说"啊,执行div和mod,我最好发出divmod1个操作码".而在第二种情况下,优化者完全有权耸耸肩并将其留在那里.

作为一般规则(尽管有许多例外),直接表示其语义的最干净的代码也是最容易优化的代码.


1对于给定的处理器,操作码名称可能不同.