読者です 読者をやめる 読者になる 読者になる

C++の勉強その2

雑記 ゲーム開発 C++

引き続き「ロベールのC++教室」

第24章 文字列をいじろう
  • Cでやった。文字列を配列で管理しなきゃいけない事を思い出す。ターミネーター。思い出す。
  • 文字列格納するとき、宣言は文字型の配列?文字列ポインタ?

http://f99aq.hateblo.jp/entry/20080501/1209653773
仕組みはここでお勉強。しかし普段どっちで宣言するのか不明。文字列の長さを比較・書き換えしたりする関数に突っ込む事を考えたら配列でちゃんと確保したほうがよさそう。多言語対応ゲームにするために、どうやって文字列を格納するかセオリーをどこかで学ぶ必要がありそう。

第26章 プロトタイプ
  • いままでプロトタイプがある言語はJavascriptのみ扱った事がある

// Proto1.cpp
#include <iostream>

int f(int x, int y);

int main()
{
    std::cout << "f(1, 2) = " << f(1, 2) << std::endl;
    std::cout << "f(158, 144) = " << f(158, 144) << std::endl;

    return 0;
}

int f(int x, int y)
{
    return 5 * x - 2 * y;
}
  • これ、プロトタイプが無いとエラーになる。コンパイルプログラムでは関数も先に宣言しとかないとエラーになる。Cの時そうだったかどうか記憶が貧しくて思い出せない。

第28章 マクロの手始め
  • Cであった記憶がある。定数の定義に使う? と思ったら。こちらが詳しかった

http://d.hatena.ne.jp/aki-yam/20081217/1229498370

  • 無名関数の作成など、変数名やら関数名やらを動的に処理したい場合に使うのがいいのかな? ほかには逆アセンブラ対策とか? とにかくここじゃないとダメという時に使うものという認識で良いのかな。
第31章 メモリとアドレス〜ポインタ関連
  • Cでざっとお勉強したが、ポインタ関連は書きながら復習しよう。たぶん、大丈夫。でも型が怪しい
  • オブジェクト(クラスインスタンス)へのポインタの型はどうすればいいの?→クラス型みたいな呼び出し方らしい。またどこかで深追いする
  • スタックとヒープを混同する事多し。stack(積み重ねる)、heap(どっさり山に盛る)ってイメージかな。んで動的生成されたものは山盛りのヒープに生成される。山盛りだから初めと終わりのアドレスがわかんないから確保と開放の管理が必要って事かな。花見の席取りみたいなイメージか。んでオブジェクトは基本大きさが分かんないからヒープに生成されんのかな?→コンパイラが決める。静的なやつだったらスタックに入る事もあるみたいだけど、コーディングする側としてはヒープにあるものとして書いていく
  • newしまくるとdelete忘れたらめんどいからオブジェクト作るのは最小限にしておいたほうがいいのかな?→スコープ抜けるとポインタ自体は消えるけどその先のオブジェクトはヒープに残るらしい。全体をオブジェクト思考で書くと地獄を見るのかもしれないけど、そうしないと気持ち悪いコードになるんじゃないのか。


ゲーム作る時のGCについて…
http://qiita.com/ueshita/items/e6264508a4dc9738a7cc

  • GCないとオブジェクト思考で書きにくくない?と思ってgoogleしてたらこんな記事を書いていくれている人がいて実装方法を随分示唆してもらった。D言語の話題だけど、Cの人がD触ってるって事で凄くわかりやすい。ここから掬い取れるもの。多分ゲームプログラミングは、1にも2にも実動作時の負荷を気にしている。思想の根底は、静的に、事前に、出来るだけ物を確保しておくというものが透けて見える。多分消す時もロード画面なんだろう。んで負荷が気になる時のみ分散目的で都度生成や削除に書き換えたりするんだろう。
  • そうなるとマジックナンバーや非感覚的なコードが増えていく。その結果ソースの綺麗さなんて誰も求めなくなる、って事なんだろうか。


しばし脱線
cocos2d-x 3.0 + C++11で始めるゲーム開発超入門
http://www.slideshare.net/giginet/cocos2dx-30-c11

cocos2d-xで作れば移植が楽かなと思って…。


さらに脱線
Wikipedia: Boost
https://ja.wikipedia.org/wiki/Boost
ああこいつは便利そうだ。標準ライブラリに目を通したあとにこちらに。

そろそろロベール先生に復帰。

第37章 参照

ポインタ渡しと参照渡しのは何が違うの?
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1320144958

  • 機能の差異はともかくポインタ渡しを参照渡し に代替していけるところはしていくべきなのか、上記サイトでもそれのほうが分かりやすい、わかりにくいと意見が分かれている。参照渡しのほうが一応高速らしい。引数に使う部分に限ってはNULLを蹴ったりする分、strictなコードになりそうな参照渡しがいいかなあsyntaxは受け取る側が管理したいし


第39章 1+1=5??
  • アドレスの計算は加減算のみ。2次元配列などで掛け算が必要な場合は型キャストをを使わなきゃいけない
第46章 ビットでいじろう
  • フラグ管理の定番だけど…、可読性落ちるしよっぽど速度気にならなきゃオブジェクトプロパティとかで個別管理でいいかなあ。フラグひっくり返す時も…分岐でいいかなあ。過去もDBのカラムに無理に突っ込むためと暗号化くらいにしか使ったことないし・・ああでもセーブデータどうするかな。内部はビットで持って、アクセスはプロパティとか分かりやすい実装が良いのかな。 Boost.Serialization? 構造体ならバイナリそのままダンプして再読み込み出来るみたい。
第63章 参照するな
  • NULLは0。0はNULL
第66章 インライン関数
  • 最近のコンパイラは頭良いからインライン関数にしなくても勝手に調節するからあまり意味ないとの意見もあり。そんな重いゲームを作る気もないので、気持ちの問題かな。
第73章 借りたら返す3
  • 他で見ると1スレッド1MBくらいしかないらしいので、スタックメモリの使用は必要最小限にする


というわけで1部は終わり2部に。