空想犬猫記

※当日記では、犬も猫も空想も扱っておりません。(旧・エト記)

C++

return throw 問題

今日ハマったC++の落とし穴。次のコードの出力結果を予想してください。 #include <iostream> #include <exception> using namespace std; static void assertZero(int i) { if (i == 0) return // // I'm sure it is not a zero!! // throw exception("Not a zero"); } int main(</exception></iostream>…

一時オブジェクトの寿命

C++

先輩にバグじゃないの?と指摘されたコード。 class MyString { public: MyString(); MyString(const std::string& s); : }; extern const std::string& GetName(int idx); int main() { for (int i = 0; i < N; ++i) { const MyString& s = GetName(i); // …

VC++のunordered_set/unordered_mapが遅い件

C++

正確に言うと、insertが同種のset/mapに比べて圧倒的に遅い。最近、メモリの節約のために辞書的なオブジェクトを作成して、同値のオブジェクト(例えば文字列)を再利用するようなコードを書いたところ、unordered_set/unordered_mapで思うような性能が得ら…

再帰呼び出しをループに置き換える

半年に一度くらい、古いコードで使っている再帰呼び出しが原因でスタックオーバーフローになるという不具合が発見され、その都度ループで書き直す修正を入れている。再帰呼び出しをループに展開する方法は、「幅優先探索」や「深さ優先探索」というキーワー…

コンテナ内の検索の速度について(2) ~setの使いどころ~

C++

C++エクササイズその3。前回、前々回の実験で、setの良さが発揮できなかったものの、何となく経験に反する結果だったので、もう一つだけ実験してみた。具体的には、要素の中身をintからstringに変え、要素数2000から50000のコンテナに対してそれぞれ100万回…

コンテナ内の検索の速度について

C++

追記:この記事には続きがあります。C++エクササイズその2。前回の実験で、要素の追加についてはvectorの性能が際立っていたので、今度は要素の検索について実験してみた。vectorに対して要素の検索をする場合、誰もが思いつくのはに定義されているstd::find…

コンテナへの挿入の速度について

C++

C++エクササイズ。今回は挿入の速度に的を絞って計測してみた。やったこと ランダムな整数値を50000個生成 整数値をコンテナに挿入する 2の操作を各コンテナにつき10回繰り返す vectorについてはさらに3つの異なる条件でも実験してみた。 (R) ... あらかじめ…

火曜日:CRTP

昼飯は焼きそばとゆで卵。晩飯はホッケの干物に掛け蕎麦。ようやくC++コンパイラの実装が枯れてきたのもあって、最近はC++を積極的に使った実装技術についてあれこれ調べている。テンプレートというのは型付きのマクロなので、まずはマクロをテンプレートで…

SHA-1 for Windows (Little Endian)

*追記:Windows Vista以降だと、CNGというライブラリがあるようです。こちらのほうが実務では役立つかも。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa376210%28v=vs.85%29.aspx *追記2:現時点では実務ではCrypto++を使うのがベストと思…

if のスコープの話

C++

C++を生業にしてかれこれ8年くらい。C++を現実の問題を解くための単なるツールという本来の役割として活用はしているものの、ここ数年あまりC++の言語仕様については深く調べていない。私を含めて今のチームのメンバーはみんな現場のオッチャンプログラマな…

C/C++でSkype.frameworkをいじってみた

http://forum.skype.com/index.php?showtopic=32933 を参考にして、以前から興味のあったSkypeのAPIをいじってみました。Skype.frameworkや必要なドキュメントは上のリンクから辿ってダウンロードすることができます。Skypeの興味深いところは、マルチプラッ…

GCCの__builtin_return_addressを使ってカジュアルにバックトレース

仕事でWindows上のバックトレースを取得するStackWalk関数周りを調べていて、ふとMacOSXではどうやるのか気になったのでやってみました。Leopard以降では、そのものズバリ backtrace()、backtrace_symbols()という関数があり、またC++限定であれば、例外処理…

続・Base64 encoding/decoding (in C)

C++

id:xoinu:20090727 では,C++の標準ストリームのstreambufを拡張してストリームフィルタを作成してみた。これをCで書くとどうなるだろう。残念ながら,ANSI Cには無いけれど,BSD系の標準I/Oライブラリに funopen というのがあって,これを使うと,FILE*を拡…

Base64 encoding/decoding filter

C++

「iostreamの拡張」を見てたら,自分でも何か書きたくなったので「Base64 - Wikipedia」を参考にしながら,Base64にエンコード/デコードするC++のストリームフィルタを作ってみた。使い方は簡単。base64_(en|de)code_filter を,(出力先|入力元)の stream …

Cでオブジェクト指向フレームワークを作る (3) 〜 C言語によるオブジェクト記述法「C~(シー・チルダ)」(原理編)

C++

id:xoinu:20090507,id:xoinu:20090509,id:xoinu:20090511,に続いて,いよいよオブジェクト指向の記述を実践してみようと思います。オブジェクト指向とは何かについては,Wikipediaを引いておきます。ここでは特徴として ポリモフィズム (多態性、多相性) …

多重継承,仮想継承使ってますか?

C++

以前も触れたことのあるGoogle C++ スタイルガイドをまた読み直してみた。例外禁止,実行時型情報禁止,ストリーム禁止(ログ以外)とかは,かなり賛成。*1実装の多重継承については賛否両論あると思うが,Javaが基盤言語の1つとして選ばれているからには,…

C++0x について

C++

C++0xの拡張については,小手先の改良が多くて戸惑うところが多い。型推論とか,コードを逆に読みにくくしないかと心配してしまう。お腹いっぱいなところに,さらにいろんな概念がてんこもりって感じ。C++は,例外処理とテンプレートを無くせば,かなりいい…

Linux カーネル コーディング規約

C++

C言語について知るためにLinuxのコーディング規約を読んでみた。百戦錬磨のハッカーの主張とあって,なるほどなぁと思うところが多い。K&Rをリスペクトしているところも,流石だと思う。やっぱりCだったらK&R,C++だったらD&Eとかプログラミング言語C++に従…

第4のメモリ管理方法 〜 AutoReleasePool

C++

C++では生ポインタなんか使わず,shared_ptr などのスマートポインタを使いなさいというのが,ごく一般的に言われることだと思う*1。JavaやC#などのもう少し先進的な言語にのめり込んで,かつGCの効率の良さを主張する人々は,ガーベージコレクタ(ガベコレ…

Cでオブジェクト指向フレームワークを作る (2):例外処理の準備

C++

オブジェクト指向とはあまり関係ないけど,例外処理について考えてみた。CとC++の決定的な違いの1つが,例外処理のやり方。Cの場合は,基本的に関数の返り値を使うか,静的なエラーバッファの情報を使うか,あるいはその両者の組み合わせを利用する。C++はそ…

Cでオブジェクト指向フレームワークを作る (1):ポインタの準備

C++

よく,解説記事などで,オブジェクト指向の三本柱は「継承,カプセル化,多態」なのだとか言われている。そのうちの1つ,多態を上手く扱うためにC++にあって,Cに無い機能が,ユーザー定義型の暗黙の型変換である。地味だけど重要な機能である。どういうこと…

Cでオブジェクト指向フレームワークを作る (0)

C++

…という試みをすると,多くの人にとって,結局「C++って便利だね」というオチになりそうな気もするが,思考実験として取り組んでみようと思う。 Cで実現する「ぷちオブジェクト指向」 Cによるオブジェクト指向'風'プログラミング Cによるオブジェクト指向の…

メモリ再生系のバグ

C++

今日は,久々に一日がかりの bug fix を行う。症状は std::map<Object*,Data> _map;みたいなオブジェクトがあって,オブジェクトに対応するデータをマップで管理しているんだけど,なぜかデータが,他の要素と入れ替わることがある,という気持ち悪いバグだった。基本ライ</object*,data>…

C++のキャスト

C++

「うちの会社にはC++のキャストを理解している人がいない!プンスカ!」とつねづね思っていたが,かくいう私も,いままで void ポインタから普通のポインタへのキャストに reinterpret_cast を使っていたというのは秘密だ。で,本当は意図からすると static_…

Double Dispatch (Visitor pattern) に関する考察 (4)

C++

id:xoinu:20070629,id:xoinu:20070630,id:xoinu:20070701 で長々とみてきた Double Dispatch の(Visitor パターン)みそは,結局何なのか?もっと的確な言葉が見つかった。 元のクラス(群)をいじらずに,仮想関数を追加できる しかも,仮想関数のスコー…

Double Dispatch (Visitor pattern) に関する考察 (3)

C++

id:xoinu:20070629,id:xoinu:20070630:1183260530 の続き。で,ようやく私なりに考えて,double dispatch(Visitor パターン)について思うことを2つ書いてみたい。 Visitor パターンの幻想? Visitor パターンの本質は double dispatch にある。で,double…

Double Dispatch (Vistor pattern) に関する考察 (2)

C++

おお,どうやら id:xoinu:20070629 では,Visitor と Acceptor の名前を入れ違えていたようだ。どおりで Visitor が visit しないで,Acceptor が visit してるわけだ…(笑)。そもそも double dispatch の説明をするために,より知名度の高い Visitor を覚…

Double Dispatch (Vistor pattern) に関する考察 (1)

C++

Double dispatch は,よく Visitor パターンの説明で出てくるが,visitor.visit() でビジターが重要な理由を,いまいち理解していない。今手元に原著がないので分からないが,どうやらWebで参考にしたページが,Visitor と Acceptor を逆にして説明していた…

値渡しの const

C++

ビルド待ちの間に,C++ Coding Standards―101のルール、ガイドライン、ベストプラクティス (C++ in‐depth series) を読んでいたら,項目15の隅っこのほうに 関数宣言において,値渡しの関数パラメータのconst宣言は避けよう。次の2つの宣言はまったく等価で…

未だ周回遅れ

継続的に何年もバージョンアップを続ける framework を設計するようになり,ようやくインターフェースと実装を分離することの大切さを身にしみるようになってきた。そのやり方にはいくつかあると思うが,最近になって COM のやり方を見直している。実際,今…