c/c++

Boost.勉強会#4で「ゲーム開発のC++」を話してきました

とりま、 アップロードしました。 スタッフの皆さん、参加者の皆さんお疲れ様でした。 アキラさんには直前まで資料作っていてご心配をおかけいたしました。orz...Boost study#4View more presentations from Isoparametric !.

使いもしないのにC++のtemplateを毛嫌いする全ての人に

C++AdventCalendarの記事です。さて、 生配列使ってますか? tr1::array(boost::array) 使ってますか?生配列使っていると答えた貴方、 →まず死ね。はい、arrayが常識ですよね。 さて、とはいえ、 「テンプレートを使うと遅いしコードがでかいし」 「生配…

dlmallocはC++があったから生まれたといっても過言ではないのだ

なんだってー!!!!(;゚д゚) (゚д゚;(゚д゚;) いや、過言かもしれませんが、C++の存在がdlmallocを書く切っ掛けになったのは確かです。 dlmallocは現在はLinuxなどのデフォルトのmalloc実装ではありませんが、 dlmallocは本当に優れたアルゴリズムを持って…

とある愚直のリニアサーチ

前のエントリで線形探索のメモリアロケータは駄目だ駄目だ、と言いました。 で、まず線形探索の何が駄目って、メモリは以下のようになっています。 最初は「未使用領域(青)」しかありません。ここからどう領域をとっても良いです。 ただ、使っていくうちに…

とある愚直のアロケータ

前置き。dlmallocについて書くぞ!と言っておいて書いてなかったので。orz...すみません。 あろけーたをじぶんでかいてはいけません!! なぜ、って大抵糞だからです。 例えば、こんな管理構造を持ったアロケータをよく見るんですが、 typedef struct _Alloc…

STLも解析してくれる静的解析ツールcppcheckを試す、と思ったら……

静的解析ツールって商用のものだと結構あるわけですが、 まぁ、基本的にこんなツールは有用性を示してもぽんぽん買ってもらえる訳もないので オープンソースに依存するわけです。 で、C++ならSourceForge.net: cppcheck かなあと思ってプロジェクトにかけて…

とても邪悪な解き方

Cクイズ こっちわからん>< - So Many People, So Many Different Ideas /* MyTypeの定義 */ void set(MyType m, int val); void inc(MyType m); void print(MyType m); int main(void) { MyType m; set(m, 0); /* mを0にセット */ inc(m); /* mをインクリ…

配列をポリモルフィックに扱ってはいけない

元々は 今日の仕組まれたバグ こちらを見たときにずっと書こうと思っていたネタです。 num が 1 の状態でしか確認されてなくて、いざ使うことになって2以上にした途端に Segmentation fault するとか嫌がらせだろw ただの凡ミスなんだろうけど、なんかテス…

NRVO(RVO)とMove Semantics

ムーブセマンティクスについて調べたところで自分が気になったこと。 BigFatMovableObject GetBigFatMovableObject() { BigFatMovableObject mo; return mo; } int main() { BigFatMovableObject mo(GetBigFatMovableObject()); return 0; } 最初、自分はこ…

で、結局のところ右辺値参照ってなんなのさ?

いよいよ、右辺値参照とは何か、ということです。 ムーブコンストラクタと、コピーコンストラクタの話を前にしました。 ここで、 ムーブコンストラクタを持つオブジェクトは「移動可能オブジェクト(movable object)」である。 コピーコンストラクタを持つオ…

Move semantics に対応した Boost.Containersとは?

ということで、再びBoost.Containerに戻ってきました。 (コピーコンストラクタと、ムーブコンストラクタについてよくわからない場合は前の記事へ) ムーブセマンティクスに対応する、というのはどういうことかを考えます。 では、ムーブコンストラクタに対…

C++における「コピー」と「移動」、ムーブセマンティクスへ至る病

まずムーブセマンティクスとは何か、ということは忘れます。 C++における「オブジェクトのコピーと移動」について考えます。 C++にはオブジェクトに対して「コピー」と「移動」という概念があります。 一般的なのは「コピー」です。 お馴染みの「コピーコン…

Move semantics に対応した Boost.Containersを試す

id:melponさんに教えて頂いた Boost.Containers を軽く試します。 Boost.Containerライブラリは、STLコンテナを含むいくつかの有名なコンテナを実装します。 このライブラリの目標は、標準コンテナにないもの、あるいはC++03のコンパイラで最新の標準ドラフ…

土曜日はBoost.勉強会でした!

書くの遅れましたが、^_^; いろんなC++な話に触れて凄く勉強になり、刺激になりました。 とても素敵な勉強会でした。 次もまた行きたい!! 誰が誰だかわからなくておろおろしてたのは内緒です。 スピーカーの皆様、参加された皆様、本当にお疲れ様でした!B…

イテレータを使う時、破壊されないようにしよう

C++でiteratorを使う時にありがちな不可解バグとして「イテレータを走査中にイテレータが破壊される操作を行う事で不可解な挙動を示す」ことがあげられる。 例えばvectorのiteratorを走査中には追加や削除を行ってはいけない。 これはポインタを利用したvect…

クラスをSTLコンテナにいれると恐ろしい事が起こるぞ!

C++に慣れている人にとっては考えもつかないことですが、 クラスをコンテナにいれる、ということを試したくなる時期があります。 コンテナにクラスのポインタをいれるとポインタ管理が面倒だし、 クラスの実体をいれておいたら便利じゃない? というのがその…

VC6.0よりも最新のC++コンパイラでC++を書くと良い8の理由と、悪いほうの8つの理由(大嘘)

元ネタ:C++ よりも C# よりも Java でゲームを作ると良い 8 の理由と、悪いほうの 8 つの理由 (大嘘) - ぐるぐる〜1.STL が便利 VC6はメンバ関数テンプレートが実装されていなかったVC4~VC5までの呪いを受けているのでSTLが変。 VC6.0で既にメンバ関数テン…

ぼくがかんがえたさいこうのはいれつ2

割と経験があり、STL?って思っているようなプログラマが書きそうなArray。 std::vectorはメモリの確保に倍に近くなるようなサイズで保持領域を増やすため、 ページサイズを指定して、その単位のサイズだけ常に伸びるようになっている。 operatorなどの便利メ…

ぼくがかんがえたさいこうのはいれつ

C++は厨二病なので、 テンプレートを憶えたてのプログラマはすぐに 「ぼくがかんがえたさいこうのはいれつ」を書きたがります。 STLがあるじゃん? というと、使いにくいと言います。 で、ぼくがつかいやすいはいれつくらすをかきます、と言い出して配列を書…

STLのqueueとかstackとかが好きになるたった一つの方法

全国1,000,000人のSTLファンのみなさんに朗報です。 STLのqueueとかstackとか使いにくくないですか? あれって、中身はlistとかqueueとかvectorのくせに使いにくくないですか? 触れるインターフェイスが少なすぎ、とか思ってないですか? 渡したコンテナを…

デストラクタがvirtualじゃないクラス、例えばvectorは継承しちゃだめなんだぞー!

と言われたら。 C++ code - 21 lines - codepad class Container { public: ~Container() { printf("Container::~Container()\n"); } }; class Hoge : protected Container { public: }; int main() { Hoge h; Hoge* hoge = new Hoge(); delete hoge; いった…

STLのvectorに文句を言わずに自分で頑張る方法

1.自分でvectorを書く 死亡フラグ。/(^o^)\ イテレータも使えないカスコンテナができる可能性99.9%。 今すぐ死んだ方が良い。 2.STLのvectorをprotected継承してカスタマイズする 例えばこんな感じ。 C++ code - 40 lines - codepad これは最初からres…

スタックが枯渇した……死にたい

こんなんで30分も使ってしまった。 意外と気づかんよね。 class Base { public: virtual void exec(){} }; class Derived : public Base { public: virtual void exec(){ Base:exec(); } }; int main() { Derived d; d.exec(); }

それはどこのメモリ領域じゃ? deleteに引数がないなんて……!

CやC++を使っている際、ある特定のメモリ領域からアロケートしたい、ということがある。 例えばファイルに関するものはファイルアロケータから、とか。 また、デバッグで使うようなメモリならデバッグアロケータから、とか。 Cならmallocとfreeを変えるかフ…

C++の塔

会社でC++の本を積み上げていると明らかに不審者なので、 コソコソと撮ってました。 会社には代表的なものしかおいてないですが、 C++の本が全体の五分の一程度なので、他のを積み上げるとひどいことになります。 よく見ると赤いBoost本や、STL標準講座を取…

C++タワー

C++本16冊すべて届きました - 危ないRiSKのブログ C++本を積んでみた - Faith and Brave - C++で遊ぼう C++ っぽい本を積んでみた - ぐるぐる〜 C++な本たちを積んでみる - みねこあ自分も本を積んでみようかと思ったんですが、殆ど会社なので断念。 殆どが…

とりあえず、C++を遅いというCプログラマを使ってはいけなかったコトだけは解った

さあ、ここからどんどん暗黒面に突っ走りますよ!(つまりは愚痴です)長年Cだけやってきた人が大抵言うこと「C++は遅い」。 いや、「C++の書き方を知らないから遅いコードを書いたんじゃないの?」 「C++の事を知らないという不勉強さをC++という言語のせい…

std::vectorはダメだという人間に限ってstd::vectorより劣ったものしか書けない

なんとなく考えること。 「可変長配列」を使っていて、 std::vector(の動作)はダメ、とか自前で書いた方が良い、なんてことをいう人がいるんだけれど、 std::vector以上のものを書くことができるのか?そういうとき、その人は文句は言えるがstd::vectorよ…

突き進めればgotoは使わない機能になる

使ってはならないのは「goto」ではないgo to文は 有害であるみねこあさん経由。 自分なりの視点で書きます。 最近書いているプロジェクトは二十万行程度の規模ですが、 gotoは一度も出現しません。しかし、 ifやfor、while、switch、returnなどは惜しみなく…

インターフェイスに全てのオブジェクトが行えないメンバ関数を追加していくときの違和感は異常

何を抽象化しようとして、 例えば、 非仮想関数を束ねて、例えば、 図形の ObjectSphere や ObjectBox、 はたまた、ObjectRenderXXXX なんかを統合して、 ObjectShapeとして、 メソッドにvirtualを付けて メソッドをインターフェイスに公開する時の違和感は…