2

「Surviving the Release Version」の記事のconst と volatileの章で、コンパイラがconstキーワードを最適化ジョブのヒントとして使用できるという考えが浮かびました。

コンパイラーが関数をインライン化できるようにするための、コンパイラーまたは関数の設計原則に関する他の最適化のヒントをいくつか知っていますか?

ところで、プリミティブ型の関数のパラメータは、const や const 参照 (や のように) として宣言していますvoid foo(const int i)void foo(const int& i)?

ありがとう!

4

7 に答える 7

3

const修飾がコンパイラによるコードの最適化に役立つことはめったにありません。なぜこれが当てはまるのかについては、Herb Sutter の「Constant Optimization?」で詳しく読むことができます。

最後の質問に関して: 一般に、コピーするのが安価なもの (基本的な型オブジェクト ( ints やfloats など) や小さなクラス型オブジェクトなど) を値で渡し、他の型を const 参照で渡すことをお勧めします。これは非常に一般的な規則であり、多くの警告と例外があります。

于 2010-11-14T22:25:40.980 に答える
1

いくつかの最適化を有効にするとすぐに、コンパイラはパラメーターiが変更されていないことに気付くため、生成されたコードではそれを as として宣言するintか asとして宣言するかは問題ではありません。const int

パラメータを渡すポイントは、const &不必要なコピーを避けることです。小さなパラメーター (1 マシン ワード以下) の場合、これはパフォーマンスの向上につながらないため、これを行うべきではありません。foo(int)よりも効率的ですfoo(const int&)

于 2010-11-14T22:26:47.437 に答える
1

どちらの形式にも実際的な利点はありません。型が 1 つの機械語に満たない場合は、値で取得します。もう 1 つのことは、最新のコンパイラのセマンティック分析は、const ができることとできないことをはるかに超えていることです。最適化を適用できるのは、コンパイル済みであるか、コードが非常に複雑な場合のみです。リンク先の記事は数年前のものであり、コンパイラはそれ以来大幅に改善されています。

于 2010-11-14T22:30:46.753 に答える
0

Linuxカーネルまたは同様のプロジェクトのソースを調べると、gcc(または使用されているコンパイラ)に渡されるすべての最適化の手がかりが見つかります。Linuxカーネルは、標準に含まれていない場合でも、gccが提供するすべての機能を使用します。

このページは、C言語に対するgccの拡張機能をまとめたものです。constとvolatileはCでも使用されているため、ここではCを参照しました。ここでは、CやC ++だけでなく、コンパイラの最適化が問題の焦点になっているようです。

于 2010-11-14T23:23:05.617 に答える
0

constの本当の目的は最適化とはあまり関係がないと思いますが、それは役に立ちます。コンパイル時チェックの本当の価値は、変更してはいけないものを変更できないようにすること、つまりバグを防止することではないでしょうか?

変更しない小さな引数については、値による呼び出しを使用します。

変更しない大きな引数については、const.

変更する大きな引数または小さな引数についてconst、 .

ところで: ニュースの場合、実際のパフォーマンスのためには、プロファイリングによって実際に発生している問題を見つける方法を知る必要があります。それを行うコンパイラはありません。

于 2010-11-15T17:31:00.603 に答える
0

いつでも constness をキャストできるため、コンパイラーが const キーワードを最適化に使用できるとは思いません。

最適化よりも正確さのためです。

于 2010-11-14T22:25:08.950 に答える
0

私の頭の上からいくつかの「一般的なコンパイラ」のもの。

  • 変数が変更されないというヒントとしての const
  • 変数がいつでも変更できるというヒントとしての volatile
  • キーワードを制限する
  • メモリバリア(コンパイラに特定の順序を示唆するため)-おそらく「最適化」はあまり気にしません。
  • inline キーワード (慎重に使用してください)

ただし、これらはすべて、大規模なプロファイリング ルーチンからのみ得られるべきであり、実際に最適化する必要があるものを把握できます。一般に、コンパイラは、プログラマからのヒントをあまり必要とせずに最適化するのが得意です。

于 2010-11-14T22:26:30.187 に答える