1

引数にポインタをとる関数がインライン化されている場合、コンパイラは最適化プロセス中に間接参照を削除しますか?もちろん、それが理にかなっているとき。

明らかな例を次に示します。

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;
}

この場合は些細なことですが、コンパイラが最適化を行う場合、そうでない場合がありますか?

ボーナス:コンパイラによって行われたいくつかの「基本的な」最適化のリストはどこで入手できますか?

追伸:私はただ興味があります

4

3 に答える 3

5

私はGCCを想定しているので、探しているリンクはhttp://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htmlです。

そして引用する:(これはあなたが得ていたものではないかもしれません)

-findirect-インラインインラインは、以前のインライン化のおかげでコンパイル時に認識されていることが判明した間接呼び出しでもあります。このオプションは、インライン化自体が-finline-functionsまたは-finline-small-functionsオプションによってオンになっている場合にのみ効果があります。

Enabled at level -O2.

Visual Studioコンパイラ(C ++を含む)の同等のドキュメント http://msdn.microsoft.com/en-us/library/k1ack8f1.aspx (詳細については、リンクをたどることができます)

于 2011-09-09T15:18:41.440 に答える
1

優れたコンパイラはこれを行います。ただし、これは2段階のプロセスになります。まず、関数をインライン化します。後のフェーズでは、構造体の唯一の使用法は一時的にそれを保持nameして削除することであることに気付く可能性があります。

于 2011-09-09T15:19:33.900 に答える
1

はい、私の経験では、これはポインター(CおよびC ++)と参照(もちろんC ++のみ)の両方に当てはまります-ほとんどすべての適切なコンパイラーは、冗長な間接参照を最適化します。VisualStudioでさえこれを行います。

于 2011-09-09T15:20:03.220 に答える