web-dev-qa-db-ja.com

const-correctnessはパフォーマンスを改善できますか?

CまたはC++コードでconst-correctnessを強制することは、保守性に関して良い習慣であるだけでなく、コンパイラーが最適化を実行できるようになる可能性があることを何度も読みました。ただし、完全に反対も読んでいます-パフォーマンスにまったく影響しないこと。

したがって、constの正確さがコンパイラのプログラムのパフォーマンス向上に役立つ例はありますか?

74
shuhalo

constの正確さは、_const_cast_およびmutableが言語にあり、コードが規則に従って規則を破ることができるため、パフォーマンスを改善できません。これは、C++ 11ではさらに悪化します。C++ 11では、constデータを使用できます。 _std::atomic_へのポインタであること。これは、コンパイラが他のスレッドによって行われた変更を尊重する必要があることを意味します。

とは言っても、コンパイラが生成するコードを見て、実際に特定の変数に書き込むかどうかを判断し、それに応じて最適化を適用することは簡単です。

つまり、constの正当性は、保守性に関してgoodのことです。そうしないと、クラスのクライアントがそのクラスの内部メンバーを破壊する可能性があります。たとえば、標準のstd::string::c_str()を検討してください-const値を返すことができなかった場合は、文字列の内部バッファーでねじ回すことができます!

パフォーマンス上の理由でconstを使用しないでください。保守性の理由で使用してください。

61
Billy ONeal

私の経験では、いいえ

スカラー変数の場合、コンパイラーは値が変更されるたびに決定し、必要な最適化自体を実行できます。

配列ポインターの場合、constの正確性は、潜在的なエイリアシングの問題がある場合に値が実際に一定であることを保証するものではありません。したがって、コンパイラーはconst修飾子のみを使用して最適化を実行することはできません

最適化を検討している場合は、 __restrict__ または特別な関数修飾子/属性: http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

6
Anycorn

少し古いですが、まだ適用されます: http://www.gotw.ca/gotw/081.htm その他: http://cpp-next.com/archive/ 2009/08/want-speed-pass-by-value /

5