![](/img/trans.png)
[英]Array Division - What is the best way to divide two numbers stored in an array?
[英]What is the best way to perform a division and a modulo for the processor?
如何同时执行除法和取模。 处理器可能吗?
喜欢 :
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;
谢谢。
考虑以下功能:
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行包含一个除法。优化器在这方面非常擅长。
也许这更好?
为什么会这样呢? 对于程序员和编译器/优化器来说都是晦涩的。 在没有查看编译器输出的情况下,我可以想象任何体面的优化器都能看到您的第一个代码,并说:“啊,正在执行div和mod,我最好发出divmod
1操作码”。 而在第二种情况下,优化器完全可以耸耸肩并留在那儿。
作为一般规则(尽管有很多例外),直接说明其语义的最干净的代码也是最容易优化的代码。
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.