回答編集履歴

1 説明補足

KSwordOfHaste

KSwordOfHaste score 17938

2017/02/16 16:13  投稿

クラス/構造体の内側に定数を置くかグローバルな定義として置くかは定数定義の性質次第かと思います。  
 
値定義を宣言と同時にするか宣言と定義を分離するかについては・・・  
 
参考にされたページには「ヘッダーに直接定数を書くとそのヘッダーを修正して定数を変更すると参照しているヘッダーをincludeしているソースを全部コンパイルしなおさないといけない」と書いてあります。
開発中に調整したいような定数の場合はそうしたことを意識して定数の定義をソースファイルへ置いておくとコンパイル範囲を制限できるので便利といえるでしょう。ではヘッダーへ定数を書くとよくないかというと利点はあると思います。それはヘッダーに書いた定数はソースをコンパイルした時点で確定しているため値を参照した際にコンパイラーが最適化してくれると期待できるからです。
例えば以下のようなソースをコンパイルしてみると・・・
```
---a.h---
class A {
public:
 static const int N;
 static const int M = 10;
}
--a.cpp--
const int A::N = 10;
--main.cpp--
#include "a.h"
...
int v1 = A::N;
int v2 = A::M;
$ g++ -g -S main.cpp
-- main.s --
   ...
   ;以下の3行がv1への代入
   .loc 1 9 0
   movq   .refptr._ZN1A1NE(%rip), %rax ; Nのアドレスをraxへ入れ
   movl   (%rax), %eax                ; raxの中身をeaxへ入れ
   movl   %eax, -20(%rbp)             ; eaxの中身をローカル変数v1へ設定
   ;以下の1行がv2への代入
   .loc 1 10 0
   movl   $10, -24(%rbp)              ; 値10を直接ローカル変数v2へ設定
```
のようにNは実際に定数値が入っている変数Nの中身を参照するコードが生成されるのに対してMは定義した値10がそのままリテラルとしてコンパイルされていることが伺えます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る