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

时间:2014-09-21 16:06:48

标签: c++ c division modulo processor

如何同时执行分组 AND 模数。处理器有可能吗?

喜欢:

int a, b = 8 / 3; //a = 2, b = 2

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

int a = 8 / 3;
int b = 8 % 3;

也许这更好?

int a = 8 / 3;
int b = 8 - a * 3;

感谢。

3 个答案:

答案 0 :(得分:6)

考虑以下功能:

std::pair<int, int> divmod(int x, int y)
{
    return { x / y, x % y };
}

使用g++ -std=c++11 -O1 -S进行编译会吐出以下汇编代码:

movl    %edi, %eax
cltd
idivl   %esi
salq    $32, %rdx
movl    %eax, %eax
orq     %rdx, %rax
ret

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

答案 1 :(得分:5)

  

也许这更好?

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

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


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

答案 2 :(得分:1)

也许您正在为<cstdlib> std::div提供解决的问题创建解决方案?

namespace std
{

struct div_t
{
    int quot;
    int rem;
};
struct ldiv_t
{
    long int quot;
    long int rem;
};
struct lldiv_t
{
    long long int quot;
    long long int rem;
};

  div_t div ( int numer, int denom );
 ldiv_t div ( long int numer, long int denom );
lldiv_t div ( long long int numer, long long int denom );

}; // namespace std

http://www.cplusplus.com/reference/cstdlib/div/