c++

『プログラミングの魔導書 〜Programmers' Grimoire〜』がすごいのです

すでに多くの方がご存知のことと思いますが、株式会社ロングゲートからまもなく『プログラミングの魔導書 〜Programmers' Grimoire〜』が発刊されます。発売前レビューをするということで、id:faith_and_brave さんより PDF を頂戴していたのですが、まった…

高度にテンプレート化されたC++のコードがどれだけ最適化されるかを確かめてみる。

c++

あるベクトルと行列の積を計算するような関数 product() を作る。引数に、ベクトルや行列を表す様々なものを受け取れるよう、ジェネリックに作ることにする。そのような場合に、コードが実際どのように最適化されるのかを見てみることにした。例として、ある…

Visual C++ 2008 Express Edition + distutils で x64 ターゲットを扱うには

Windows SDK をインストールし、x64 コンパイラ、ヘッダ、ライブラリをインストールしただけではだめで、次の操作が必要だった。C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin にある以下のファイルを以下の場所に移動 (+リネーム) する。 vcv…

Boost.Intrusive のコンテナを hook なしで使う

Boost.Intrusive を使いたい場面は結構あるものの、なんだ hook とか書かなくちゃいけないのか、既存のデータ構造には適用できないのか、と諦めていた。ところが、よくよくソースを読んでみると ValueTraits という trait クラスを指定することで完全にノー…

Boost.Graph の graphviz リーダだけを使ってみる

もう単純に boost::adjacent_list とかその辺に興味がない場合どうすればいいかって話です。適当な MutableGraph コンセプトを実装するクラスを用意してやればまあ一応動くみたいです。 #include <map> #include <string> #include <iostream> #include <boost/property_map/property_map.hpp> #include <boost/property_map/dynamic_property_map.hpp> #include </boost/property_map/dynamic_property_map.hpp></boost/property_map/property_map.hpp></iostream></string></map>

Boost.PHP で SPL のイテレータを実装する

残念ながら所用で参加できなかった モダンPHP勉強会。SPL の発表を Ust 経由で聞いて楽しくなってきたので、Boost.PHP でインターフェイスを実装できるようにしてみた。追記: Boost.PHP の導入については、id:Kiske さんが素敵なチュートリアルを書いている…

Boost.CoroutineとBoost.OptionalとBoost.Pythonを使って、C++クラスの内部イテレータをPythonの外部イテレータとして見せる

追記: うっかり戻り値ポリシーのところで boost::python::return_internal_reference<> を使ってしまい、メモリリークを引き起こしていたので修正しました。Stackless Python であれば continuation が使えるので、Python 側で C++ をまたぐ外部イテレータと…

enum型とtypeof()とgccとg++

次のような C のコードを gcc でコンパイルしたとき、シンボル「a」のデバッグ情報がどのように DWARF になっているかを dwarfdump で見てみると... enum X { A }; typeof(A)* a; なんかとても残念なことになっていた。 LOCAL_SYMBOLS: <1>< 45> DW_TAG_enum…

enum 型とテンプレート特殊化

追記: テンプレートの特殊化と同時にインスタンス化されていたというだけでした。仕様のどこに書いてあるのかは調査中以下のように template specialization というのはインスタンス化されたもの、明示的に特殊化されたもの両方を内包する概念のようでした。…

テンプレートメンバ関数と仮想関数を (半ば強引に) 組み合わせる

c++

追記: タイトルが不正確だと思ったので修正。Wassr で id:kazuhooku さんがつぶやいていたので、それに触発されて。それにしてもこの 2 つは本当に水と油だね。typeinfo 見てディスパッチする、というのがばっちりはまる場合というのも結構ありそうだけど、…

push_back(...) vs. insert(end(), ...)

明らかに前者の方が速いだろうと思っていたがコンパイラをなめていたようだ。 g++ (Ubuntu 4.3.3-5ubuntu4) 4.3.3 Copyright (C) 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty…

va_list を Boost.Tuple に変換する

意味あるかどうかわかんないけど思いついたので。↓以下テストコード

C++ で無理矢理 E4X のような XML 埋め込みを実現してみる

追記: id:hasegawayosuke さん曰く「c4xぢゃ?」E4X の E は embedded だと思ってたら ECMAScript だったのか。 まあ AS3 の E4X はなんなんだという話もあるわな…。 ついかっとなってやった。 int main(int, char **) { using namespace xml_builder; xml($ …

PerlのXSからPerlの関数を簡単に呼び出せるようにしてみた (C++で)

Perlの謎APIをwrapして、Perlスクリプトの関数をC++から簡単に呼び出せるようにしてみた。てか、 リファレンスカウントを透過的に行えるようpimpl形式のコンテナを使ってみる mortalを透過的に行えるようcall_sv()による関数呼び出しを完全にブラックボック…

ブロック構文ローカルな変数宣言のへんなところ

int main(int, char**) { for (static int a = 3; --a;) {} // これは通る for (int a = 2; int b = --a; ) {} // キモすぎるがこれも通る if (bool b = true) {} // これも通る struct foo { foo(int) {} operator bool() { return false; } }; if (struct …

invalid iterator同士の比較

諸事情でブログ名変えました。libstdc++とSTLportでは普通に通る下のようなコードが、VC++ (dinkumware) (2008-12-18 04:50追記: VC++の_SCL_SECURE系のチェックによるものなのでdinkumwareはあんまり関係ない) では動かなくて困っていた。operator==()で落…

invalid iterator同士の比較2

結局、上の問題への対処として、適当な空コンテナを作って、そいつのイテレータを有効でないイテレータとして扱う事で逃げようとしたんだけどそれでも依然例外が出る。テストコードは以下。さすがにこれが通らないと仕様に合致しているとは言えないだろう。 …

Python温泉でやったことのまとめ

実はPython温泉に行っていました。 1日目 夕方まで仕事のバグハンティング。 Boost.Asioを触ろうとコードを書き始める。 途中でBoostをMac OS XのframeworkにしたくなってきたのでBoostのビルドシステムの調査を開始。 夕食。奇妙な自己紹介 (「はじめにお詫…

Pyrex / Cython で C++ の参照を扱う方法

またまた頭が悪いせいで予想以上に時間をかけてしまった。例えば次のようなクラスを Pyrex (Cython) でラップすることを考える。 template<typename T_> struct position: public boost::array<T_, 3> { position() { (*this)[0] = 0; (*this)[1] = 0; (*this)[2] = 0; } positio</t_,></typename>…

g++の末尾再帰の最適化 (-foptimize-sibling-calls)

これを当てにできるなら、かなり Boost.Preprocessor 使わずにすむかもという。 #include <functional> #include <iostream> #include <cstddef> template<std::size_t Nrep_, typename Timpl_> struct iter { inline void operator()(Timpl_& op) const { op(Nrep_); iter<Nrep_ - 1, Timpl_>()(op); } }; template<typename Timpl_> struct iter<0, T…</typename></nrep_></std::size_t></cstddef></iostream></functional>

すごくどうでもいい事だけど

Boost.Variantのドキュメントにある以下の説明は穏やかにBoost.Anyをdisっているように見えなくもない。つか Boost.Any の swap で no-throw が保証されてるのはポインタ同士の交換だからで、それなら別に Boost.Variant でポインタを束ねてもいいし…。 Of c…

Boostのカテゴリ分け

Boostがどんどん肥大化しているのに眉をひそめる人は少なくないと思う。私なら以下のようにカテゴライズして提供しようと考えるけども、いまだにモノリシックなやり方を崩さないのはなんか理由があるんだろうか。ちなみに、以下のリストではライブラリ間の依…

Mozo.PHP をレポジトリに上げました。

ちょ、freehg.org は神。http://freehg.org/u/moriyoshi/mozo-php/を参照してくださいまし。ついでに PHP の parser と lexer を C++ に移植したやつ。 構文木作るとこ*1まで行ったままで止まっているこの子を誰か拾ってください。http://freehg.org/u/moriy…

Mozo.PHP (その3)

今日の最初の方にリリースしたものはメモリリークします。 本気で使っている方はここから最新版を再度落としてください。 エラー処理 (1) C++ の関数からエラーを出して呼び出し元に復帰したいときは、mozo::php::runtime_error を throw します。 throw php…

Mozo.PHP (その2)

(追記: タイトルの一部にタグを入れているところが正しくタグとして認識されなかったので直しました。重複RSSエントリが発生したらすみません。) 前日の続き。ダウンロードはここ。主な変更点: std::string を戻り値にできないバグの修正。 HashTable の変換…

C関数レベルのクロージャを C++ で実現?

前にlibffi を使ってクロージャが作れることは確認したけど、やや力技過ぎ。 ちょっと調べてみるとid:mb2syncさんの日記 (スターありがとうございました) に c_function というのが紹介されていたので試してみた。 #include <iostream> #include "c_function.hpp" stru</iostream>…

Boost.Python のような手軽さで C++ で PHP の拡張モジュールを書ける「Mozo.PHP (仮称)」

えー、久しぶりにですます調です。本日の第2回PHP拡張勉強会でグダグダながらもちょこっと発表させていただいた、あのライブラリについての紹介です。ダウンロードは以下からできます。 http://www.voltex.jp/downloads/mozo-php-20080324.tar.bz2 最新版は…

例外クラスと swap()

この組み合わせにふと考えを巡らせてみた。例外クラスにも swap() は必要か? でも、どうも明確な答えが見つからない。そもそも swap() って代入操作での例外安全性を保証するためだけのもの? #include <iostream> #include <stdexcept> #include <string> class MyException: public std::</string></stdexcept></iostream>…

Cスタイルキャストが有用な場面

mozilla/xpcom/reflect/xptinfo/public/xptinfo.h:215-218 → Bugzilla@Mozilla – Bug 49641 を見ていてなるほどと思ったのでメモ。このあたり仕様に詳しくはないけど、かつては incomplete タイプへの reinterpret_cast を許さないコンパイラというのがあっ…