Как выполнить деление А ТАКЖЕ по модулю в то же время. Возможно ли это для процессора?
Подобно :
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 и мод выполняются, я бы лучше выпустил divmod
1 опкод». В то время как во втором случае оптимизатор вполне может пожать плечами и оставить все как есть.
Как правило (хотя и со многими исключениями), самый чистый код, чья семантика указана напрямую, также является кодом, который легче всего оптимизировать.
1 Для данного процессора имя кода операции может отличаться.
Возможно, вы создаете решение проблемы, которая <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