-3
void test(const int* pInt)

また

void test(int pInt)  

最初の例では、pInt がある種の保護されていることを知っています。しかし、どのソリューションがより高いパフォーマンスを提供するのでしょうか? 両方 (const ポインターと通常の int) をメモリに登録する必要があるためです。

4

3 に答える 3

1

技術的には、最初の方がエイリアシングの影響を受けるため、2番目の方が高速になる可能性pIntがあります。関数の外部で変更されていないかどうかを判断する方法はありません。pIntメソッド内にあるからconstといって、引数として渡される元の変数が必要であるという意味ではありません。変換以外の変換は暗黙的であることをconst忘れないでください。constconst

この問題の回避策は_restrict、コンパイラでサポートされている場合に使用することです。これは本質的なものであり、言語の一部ではないことに注意してください。

ただし、ほとんどの使用法では、同じになります。プロファイルプロファイルプロファイル。読みやすくするためのコードを記述し、価値があることがわかっている場合にのみ、これらの小さな最適化を実行します。

これは次の場合に当てはまりintます。大きな構造体を渡す場合、コピーの省略をその特定のケースに適用できないと、値による受け渡しがボトルネックになる可能性があります。したがって、ポインターを渡す方が高速ですが、それでも参照を使用します。

于 2013-02-16T16:12:20.903 に答える
1

関数内のパラメーターをどうするかによって異なります。ポインターを頻繁に逆参照している場合は、間接的であり、値を変数として渡した場合よりも多くの作業を行うことになります。

この選択がアプリケーションのパフォーマンスのトレードオフを引き起こすと思いますか? 関数の実装で何をしているのか、また一方が他方よりも大幅に高速であると考える理由は何ですか?

于 2013-02-16T16:21:47.707 に答える
0

両方の例pIntは関数内で変更できません!

次に、2番目の関数への定数を忘れました。2番目の関数で必要に応じてpInt値を変更できることを理解してください。ただし、すべてが値として渡されたため、変更しても他には何の影響もありません。

あなたはこれをしたくないですか?

void test(const int pInt)

これを行うと、関数へのconst intが得られます(引数として渡されます)。

于 2013-02-16T16:38:50.813 に答える