CH8.1コンパイラの自動最適化

1439 ワード

コンパイラは何ができますか.
1. Function inlining
いくつかの比較的簡単な関数については、コンパイラは直接inliningを行います.コードにinlineであることが宣言されていなくても.しかし、保険のためにはinlineが必要な関数をinlineと宣言したほうがいい.関数のインラインの利点は(1)である.関数のジャンプ時間を節約する(2).code caching(3)に有利である.後続のコンパイラの最適化に有利であることはもちろん、ある関数の呼び出し回数が多すぎる場合や、組み込まれた関数が長い場合にコードが大きすぎる場合である.
2.簡単な定数計算
コンパイラはコンパイルの段階であなたのコードの中のいくつかの定数の計算の結果を計算します.たとえば
double a, b;
a = b + 2.0/3.0;

コンパイルが完了すると、次のようになります.
double a, b;
a = b + 0.666666666666666667;

注意:b 2のような明示的な指示をする必要がある場合があります.0/3.0コンパイラでは、計算は左から右へ計算されていると考えられます(事実上、精度を失わないように)、事前計算は行われませんので、再コンパイル段階で計算したい場合はカッコ:b(2.0/3.0)を表示する必要があります.これで上記の問題はなくなります.いくつかの簡単な関数コンパイラは直接inlineに入って、sqrt、powのように、しかしいくつかの面倒なsin関数のようにinlineに入ってはいけません.
3. Pointer elimination
Pointerやreferenceが指す内容が既知であれば、コンパイラはポインタを消去する可能性がありますが、実はinlineに相当する関数です.
void Plus2(int *p){
    *p = *p + 2;
}
int a;
Plus2(&a);

コンパイラは次のように最適化されます.
a += 2;

4.同一演算を複数回行う場合は1回のみ
int a, b, c;
b = (a+1) * (a+1);
c = (a+1) * 4;

次のように最適化できます.
int a, b, c, temp;
tmp = 1 + a;
b = tmp * tmp;
c = tmp * 4;

5.レジスタ変数
一般に32ビットシステムには6個の整数レジスタ8個の浮動小数点数レジスタがあり、64ビットシステムには14個の整数レジスタ16個の浮動小数点数レジスタがある.XMM、YMM、ZMMなどのベクトルレジスタは含まれません.
  • 変数が参照されると(pointerでもreferenceでも)、この変数はレジスタに格納されません.だから、変数をレジスタに置いてプログラムを加速させたいなら、その参照やポインタを使用しないでください.