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)
谢谢.
考虑以下功能:
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行只包含一个分区.优化器非常擅长这个东西.
也许这更好?
为什么会这样?它对程序员和编译器/优化器来说都很模糊.在没有查看编译器输出的情况下,我想任何体面的优化器都会看到你的第一个代码并说"啊,执行div和mod,我最好发出divmod1个操作码".而在第二种情况下,优化者完全有权耸耸肩并将其留在那里.
作为一般规则(尽管有许多例外),直接表示其语义的最干净的代码也是最容易优化的代码.
1对于给定的处理器,操作码名称可能不同.