涼の成長記録

自らの人生に主導権を持つべく、独立を目指して2014年3月31日を持ってITエンジニアを退職。そんな23歳♂の成長記録。

constexpr

C++素人の私が、大規模アプリケーションを開発するものだから、作るクラス作るクラス、WEBで調べながら、今の私が理解できる範囲で、最適な実装方法を模索しています。そんな中で、今日作るクラスは、アプリケーション全体で使用する定数を定義しておくクラスです。


調べたところ、クラスが肥大化しないように、カテゴライズしてクラス分割しなさい、というのが1つ。
ITアーキテクトの「やってはいけない」 - [アーキテクチャ編]巨大な定数クラスを作ってはいけない:ITpro


定数をプログラムに埋め込まず、外部ファイルで変更できるようにしておきなさい、というのが1つ。ただし、私は何百とある定数に関連した、テストを行う力量を持っていないので、今回はパスします。
定数をプロパティファイルから読み込むようにする (Java)


そこで、1つ気になったのが、constexprというやつです。以下の説明が凄く分かりやすいです。
constexpr を使うべき5の理由 - まとめ&リンク集 - ボレロ村上 - ENiyGmaA Code


まあ、分かりやすいといっても、私のような底辺プログラマーには、書いてある内容の大半が訳分からないのですが、一応有用性は何となく伝わりました。何となくです。何となく。私のモットーは何となくプログラミングです。なんて信頼性が薄いのでしょう。


さて、関数をコンパイル時定数にするとか、参照透過性がどうとか、そのあたりはサッパリ分からないのですが、型安全性とかの関係で、#defineマクロよりconst修飾子の方が好まれるよー、ってことは何となく知っています。

// コンパイル時に、プロプロセッサが置き換える。
// 名前空間が無視されたり、ちょっと良くない。
# define STEREO_SIZE (MONAURAL_SIZE * 2)

// 整数定数であれば、マクロを使うメリットはあまりないらしい。
// スコープが明確だし、型安全で、厳密に定数を定義できる。
const int STEREO_SIZE = (MONAURAL_SIZE * 2);


ですが、constよりconstexprの方が良いんですって。理由は、constexprにすることで、明示的にコンパイル時定数にすることができるのだそうです。実行時定数ではその名の通り、ランタイムで計算が行われることでも、コンパイル時に計算しておくことができるということです。


これだけ聞いても、constをconstexprに置き換えておく意味はあると思うし、使わないことには覚えないと思うので、とりあえず使ってみようと思います。
ではでは。