На самом деле код, который вы написали, не будет генерировать никаких инструкций деления, так как компилятор может выяснить результаты во время компиляции. Я написал небольшую тестовую программу и настроил компилятор (VC ++ 10SP1) для генерации списка кода сборки.
#include <iostream>
using namespace std;
struct result {
long quotient, remainder;
};
result divide(long num, long den) {
result d = { num / den, num % den };
return d;
}
int main() {
result d = divide(3, 2);
d = divide(10, 3);
cout << d.quotient << " : " << d.remainder << endl;
return 0;
}
Я должен был написать это таким образом и явно указать компилятору не включать какие-либо функции.
В противном случае компилятор с удовольствием оптимизировал бы большую часть кода. Вот результирующий ассемблерный код для функции деления.
; 8 : result divide(long num, long den) {
00000 55 push ebp
00001 8b ec mov ebp, esp
; 9 : result d = { num / den, num % den };
00003 99 cdq
00004 f7 7d 08 idiv DWORD PTR _den$[ebp]
; 10 : return d;
; 11 : }
00007 5d pop ebp
00008 c3 ret 0
Он достаточно умен, чтобы генерировать одну инструкцию IDIV и использовать сгенерированные ею частное и остаток. Современные компиляторы C и C ++ действительно хорошо справились с такой оптимизацией. Если у вас нет проблем с производительностью и вы не профилировали свой код, чтобы определить узкое место, не пытайтесь угадать компилятор.