如何同时执行分组 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;
感谢。
答案 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