2009-01-01から1年間の記事一覧

自分の書いたソースには過去の自分の見識しかなく、先人の書いたソースには先人の見識がある

このように数多くのプログラマが「車輪の再発明」の罠に悩まされているのですが,車輪の再発明(より正確に言うと,車輪の再実装)にはそれなりに意義もあります. 車輪の再実装 - Life like a clown id:tt_clownさんの反応に対してですが、 まず、自分も「…

「俺のソースだから」というプログラマは死んだらいいのに

最近こんなやりとりがあった。 「Cって標準のコンテナ(双方向リストや可変長配列など)がなくて不便。 Cのプロジェクトってコンテナ自体ないこともあるし、コンテナがないとプログラムって書きにくいよね。 その点C++はSTLが(ry」 ... 「コンテナ? STL“も”…

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を変えるかフ…

恐れることなく設計を正せ

どんなに正しく設計をしたつもりでも、 どこかで必ず「これは設計を直した方がいいのじゃないか?」 と思うことがある。そういうときに聳え立つ「既に書かれたソースたち」。 基本インターフェイスで対話していても 抜本的に手をいれなければならない事もあ…

未だにとらドラフィーバーから脱出できないorz

自分はなかなかとらドラフィーバーから、脱出できずにもがいてます。 あれ、おかしい……、というくらいはまってます。 放送のときにリアルタイムにはまったわけではないのですが、 たまにエピソードを見なおしたり、 キャラクターソングを聴いてしまったり、 …

最適なデバッグは可能性を潰していく事

minekoaさんのエントリを読んでいて、 「そうそう、コンパイラがこんなこと言うときは実際にはあんな事が起きてるんですよ」みたいな知識データベース。そしてコンパイラが検出出来ないタイプのバグについても、現象に「あれ?、どこかでみたぞ、これ」とな…

実績があるコードと製品に使った事があるコードは違う

よくあることなんだけれど、「社内の実績があるコードを使え」と言われて見てみると、 「これはひどい」というコードであることがある。 そういう人が言っている「実績がある」は「製品に使用した事がある」なんだよな。例えばあるデバイスから、非同期で読…

C++の塔

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

C++タワー

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