C ++のインラインされた関数のコンパイラ最適化
-
28-10-2019 - |
質問
引数にポインターを取得する関数がインライン化されている場合、コンパイラは最適化プロセス中に間接を削除しますか?もちろん、それが理にかなっているとき..
ここに明らかな例があります:
inline void say_hello (person* p) {
std::cout << "hello " << p->name << std::endl;
}
int main () {
person goldorak;
goldorak.name = "Goldorak";
say_hello(&goldorak);
return 0;
}
このケースは些細なことですが、コンパイラが最適化を行う場合は、そうでない場合がありますか?
ボーナス: :コンパイラが行った「基本的な」最適化のリストはどこで入手できますか?
PS:私はただ興味があります
解決
私はGCCを想定しているので、あなたが探しているリンクは http://gcc.gnu.org/onlinedocs/gcc/optimize-options.html
そして引用するために:(これはあなたが得ていたものではないかもしれません)
-Findirect-Inlining Inlineは、以前のインラインのおかげでコンパイル時に知られていることが発見された間接的な呼び出しもあります。このオプションは、インライン自体が-finline-functionsまたは-finline-small-functionsオプションによってオンになっている場合にのみ効果があります。
Enabled at level -O2.
Visual Studioコンパイラのための等量のドキュメント(C ++を含む)http://msdn.microsoft.com/en-us/library/k1ack8f1.aspx(詳細については、リンクをフォローできます)
他のヒント
良いコンパイラがこれを行います。ただし、2段階のプロセスになります。まず、関数にインラインします。その後のフェーズは、構造体の唯一の使用は一時的に保持することであることを認識することができます name
そしてそれを排除します。
はい、私の経験では、これはポインター(C ++)と参照(もちろんC ++のみ)の両方に当てはまります。 Visual Studioでさえこれを行います。