ψ(プサイ)今日はひたすらアセンブラを追いかけるだけのお話です。constな変数で行うことが推奨されてるらしいです。1;基本的には、これで問題ないのですが、リンク先によると、この定数がクラス変数の場合、定義と実体の二つに分けないといけないそうです。VAL=01234;};//ソースファイル側(実体)//gccでは宣言(ヘッダ)に値を書いても良いけど、VC++等の古いコンパイラだと実体に書かないといけない。Test:VAL;ほえー、なるほど。実際には、gccのときは、実体を書かなくても割と大丈夫みたいです。Ubuntu11.04のx86-64のgccで実験してみました(Win32のMingwでも、機械語は違いますが同じ結果でした)。あ、ZIPももちろんあるよ!!■共通のヘッダファイルはこちら。VAL2=4321;};#endif特に意味はないです。このTestというクラスの定数を使って、いろいろテストしてみましょう。以下test*-*とありますが、これをmakeのビルドターゲットにすると自動でコンパイルとかしてくれます。test*-*■(test1-1)実体を定義しないまま、std::coutに入れてみる。0;}ヘッダ上のTest::VAL1やTest::VAL2の実体を一切定義していないことに注意していください。8ret.cfi_endproc線で囲ったところを見てもらえばわかるとおり、インライン展開されています。ちなみに、1234という数値はこの場所以外一切定義されません。■(test1-2)じゃ、実体を定義したらどうなるの?定義を書き加えて(Test1-2.cc)//ヘッダファイルとメイン関数の間に追加。Test::VAL1;としてアセンブラを出力してみると...。8ret.cfi_endprocTest::VALの値が埋め込みになるのは同じでしたが、それとは独立した実体も定義されました。一切最適化オプションをつけなくても、それなりに最適化してくれるみたいです。■(test1-3)ポインタを通す等して、実体が必要な状況をつくってみるポインタを通す場合、アセンブラに直接引数を書くことはできません。メモリ上に一旦置かなければなりません。0;}今度からは面倒なのでビルドターゲットでコンパイルします。1案の定実行は失敗ですね。8ret.cfi_endproc予想通りですね。■(test1-4)でも、最適化を掛けると...。同じソースのまま、-O3とかを付けて最適化を掛けると、実行可能です。FLAT:.LC0;std::coutへの出力を行う別の関数(outVal)があったのに、インライン展開されてる。;(展開されてない、outValの実体も別箇所で存在します。;ハードコーディング。[rbp+67]■じゃポインタにしないなら良いんだね良かった良かったポインタとして使えないのはdefineでも一緒ですし、だったら同じ条件ですねやったー。...と言いたいところだが、(大佐風)微妙にこったことをすると必ず実体の定義が要らなくなるとは限りません。■(test2-1)三項演算子の結果に使う三項演算子を使って、フラグによって定数を振り分けたい!ありそうなシチュエーションです。