実際、コンパイラはコンパイル時に結果を把握できるため、記述したコードは除算命令を生成しません。小さなテスト プログラムを作成し、コンパイラ (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++ コンパイラは、この種の最適化が非常に得意です。パフォーマンス上の問題があり、ボトルネックがどこにあるかを判断するためにコードをプロファイリングした場合を除き、コンパイラを推測しようとしないでください。