Каков наилучший способ выполнить деление и по модулю для процессора?

Как выполнить деление А ТАКЖЕ по модулю в то же время. Возможно ли это для процессора?

Подобно :

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;

Благодарю.

1

Решение

Рассмотрим следующую функцию:

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. Оптимизаторы очень хороши в этом.

6

Другие решения

Может это лучше?

С чего бы это? Это неясно как программисту, так и компилятору / оптимизатору. Не посмотрев на вывод компилятора, я бы подумал, что любой порядочный оптимизатор увидит ваш первый код и скажет «ах, div и мод выполняются, я бы лучше выпустил divmod1 опкод». В то время как во втором случае оптимизатор вполне может пожать плечами и оставить все как есть.

Как правило (хотя и со многими исключениями), самый чистый код, чья семантика указана напрямую, также является кодом, который легче всего оптимизировать.


1 Для данного процессора имя кода операции может отличаться.

5

Возможно, вы создаете решение проблемы, которая <cstdlib>«s 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/

1
По вопросам рекламы [email protected]