PPPUC++#10.5
どこまでやったか思い出すのに時間が・・・
8.5.8 Function call implementation
- 関数呼び出しの詳細、何をやっているのか、です
- 計算機の例の expression(), term(), primary()は相互呼び出しするので恰好の例
- ただ、グローバルを使うと説明に困るので Token_stream&として参照を受け渡す事に変えたものでやります
- で、コールスタックの話が延々と。。。
- 面倒なのでエッセンスだけ
8.6 Order of evaluation
- コードはどういう順序で評価されるのか? という話
- で、まずは変数、記憶領域についての順番
- 矛盾さえ起きなければ最適化はコンパイラの実装にまかされている。思いっきり最適化する場合もあり得るし、大抵はそうなると思う
8.6.2 Global initialization
- 大域空間は上から順
- ってさっきも出てたような・・
- ひとつ気をつけるべきなのがさっきも出てた翻訳単位を越えた初期化について
foo.cpp
int x1 = 1; int y1 = x1 + 2;
- は大丈夫だけど(いやいや・・・)
bar.cpp
extern int y1; int y2 = y1 + 2;
- とかやめろよ、とか。
- いや,両方やめろw
- 大域名がx1とかy1とかどこにでもありそうな名前で衝突してください、といっているようなもんなのが1つ目
- また、y1, y2 どちらが先に初期化されるかで値が変わってしまうのが2つ目
- 2つ目の方がどーしても必要な場合、その場合は 関数にパッキングすると良いというテクニック
- たとえば、としてDateオブジェクトのデフォルト値が紹介されている
const Date default_date(1970,1,1);
- だと、ひょっとしたら使おうとしたときにまだ初期化されていないかもしれない
const Date default_date() // return the default Date { return Date(1970,1,1); }
- とすべき。さらにはこのままだと毎回コンストラクタ走る(?正しい?)し、無駄なコピーの可能性があるので
const Date& default_date() { static const Date dd(1970,1,1); return dd; }
- するともっと良いとの話。
- arguments about argument とか、、、Mr.Sって(ry
Namespaces
- 結局のところブロックも関数もクラスも、根本的に何をしてるかというと、名前をグルーピングしているだけ
- !!!なるほど
- つまりは
- 衝突回避可能にする
- 参照可能にする
たしかに。
-
- おもしろいなー
- しかし今度はこの
ブロックとか*1関数とかクラスとかが衝突しちゃうジャン - 人名といっしょ。「はてな 太郎」とフルネームで参照するか「太郎」だけでおkかという。太郎だとどの太郎かわかんない
namespace Name { int somevariable = 100; int anothervariable = 200; }
はこうなる。
.type _ZN4Name12somevariableE, @object .size _ZN4Name12somevariableE, 4 .type _ZN4Name15anothervariableE, @object .size _ZN4Name15anothervariableE, 4
8.7.1 using declarations and using directives
- しかし毎回毎回フルネームで呼ぶのはうっとおしい。
- その場に太郎が一人しかいないってわかってるなら楽させてよ
- というのが using です。
- もっとも単純な使い方は using
; で Local Name太郎だけでよべるようになります
- もっと怠惰なら、「とりあえず他にイナカッタラはてなさんとこの子ってことだよ」という宣言もできます。
- この本ではstd以外では un しません。あしからず
*1:ブロックは衝突しようがありませんね。名前無いから