const

私がC/C++でプログラミングするときにはあまりconstを使わないことに気付いた。constが付いたオブジェクトは代入出来ないことを意味するわけだが、主には意図しない代入を防ぐ意味で使うだろう。だが、アマチュアのプログラミングというものは設計してから書き始めるというものではない。つまり、意図しないもなにも意図なんか無いのである。本質的に代入してはいけない箇所は自分で知っているので綿密に定義したりしないのだ。それでも誤ってしまった場合に初めてconstをつけるという程度で私は使っている。

防止的意味でなくconstを付けなければならない場面もある。定数式が要求される箇所にはconst付きでない変数を含むことは出来ない。(もっとも、Cではconst付きであっても定数扱いにならないという制約が未だにあるのだが。D&Eの3.8参照のこと。)また、仮想関数のオーバーライドやコールバック関数の定義は要求される型にあわせる必要がある。そういった場合はキャストを書くのも面倒なのでconstを付けている。

もうひとつの意味としてはコンパイラに対するヒントである。代入というのはコンパイラにとってフローを追いにくいものらしく、代入しないことが明示されることで最適化しやすくなったりするそうだ。近年のコンパイラであればかなり高度なフロー解析も出来るのであろうが、C/C++の性質上の理由からコンパイル単位をまたぐような解析には限度がある。

と、言うわけで、付けれるところにはconst付けておいた方が大体は有利かなぁという話。あまり規模の大きなコードを書いたことが無いのでその辺の実感が無いのだけれども。

Document ID: 06c241d11792e4123a6691f431005e78