KAYAC 10th An... 縺翫°縺偵&縺セ縺ァ縲√き繝、繝�繧ッ縺ッ莉雁ケエ縺ァ10蜻ィ蟷エ繧定ソ弱∴縺セ縺励◆縲ゅ◎縺薙〒2008蟷エ縺ョ777縺ッ10蜻ィ蟷エ繧定ィ伜ソオ縺吮�ヲ 隧ウ邏ー »
KAYAC 10th An... 縺翫°縺偵&縺セ縺ァ縲√き繝、繝�繧ッ縺ッ莉雁ケエ縺ァ10蜻ィ蟷エ繧定ソ弱∴縺セ縺励◆縲ゅ◎縺薙〒2008蟷エ縺ョ777縺ッ10蜻ィ蟷エ繧定ィ伜ソオ縺吮�ヲ 隧ウ邏ー »
最近ひたすらXSを書いていて思ったのが,XSはやっぱり速いということ。 ただ,いつでも無条件に速いというわけでもなく,何も考えずに書くとPurePerlのコードより遅くなることも珍しくない。実際,最近書いたShikaやMOPのXS版もいきなり高速だったわけではなく,一番最初のコードはPurePerlのほうが10%-30%ほど高速だった。 いろいろベンチマークをとった結果の感触として,XSの得手・不得手が分かってきたのでメモしておく。ちなみに下記で「注意を払う」というのは内部で呼ばれるmalloc()を極力減らすという意味で使っている。SVの生成自体はmalloc()を伴わないことが多い*1が,文字列の生成/連結や配列の生成/push/unshiftでは内部でmalloc()が呼ばれる可能性が高く,速度を落とす原因となる。 得手分野 ループ - XSのループが早いというより,Perlのループ
自己言及的なテンプレート (その2) 以前、「自己言及的なテンプレート」 という記事を書いたが、今回はその補足である。 前回、事前に定義されているテンプレートで使用したのは、 最終的に定義されるクラスのポインタだけだったので、 template<class T> class X { public: T* foo() { } }; class A : public X <A> { }; このような自己言及的な書き方が可能なのだと思っていた。 でも、実は次のような使い方も可能なのであった。 template<class T> class X { public: static size_t getSize() { return sizeof(T); } }; class A : public X <A> { int x; }; int main() { cout ここでは、class A の本
自己言及的なテンプレート ついに、Java にも「総称」(genericity、C++ で言うところの template) の機能が 追加されるらしい (参照記事)。 ついでに assert 機能も。これで、C++ の Java に対する優位は、 ほとんど無くなったのかな? そろそろ Java も視野に入れたほがよいのかな? 「って、お前、それは世間から2周遅れくらいだよっ!」 というようなツッコミが入りそうだが、正直なところ、 速度が重視される Windows のコンシューマ向けアプリであることが要求される という 2つの条件を付けると、なかなか Java には移行できないんだよぉ。 まあ、それはさておき。 ときどき、ほとんど同じなのだけど、微妙に異なる振る舞いをする 2つのクラスが欲しくなることがある。今日、私が作りたくなったのは、 次のようなクラスであった。 class A { pu
Curiously Recurring Template Pattern (CRTP)とは、己自身を型パラメータとして実体化したテンプレートクラスを、己自身が継承している様を指す。 このようなテンプレートクラスでは、その型パラメータとして受け取った任意型に対し、(それが任意型であるが故に)、自身の型との、継承関係もしくは互換性といったことを、明示的に指定してやらなくてはならない場合がある。 簡単な親子関係を保持する機構をライブラリとしてまとめておきたい場合を考えよう。親にも子にも、それぞれ任意の型を指定できる汎用的なものにしたいので、テンプレートクラスライブラリにしたい。親は何でもよいし、子も何でもよい。ただ親と子の間にお互いの参照関係をつけるだけのテンプレートクラスライブラリだ。以下のようなものを作ったとする。 template< class C > class Parent { pub
Jaap Suter, July 22, 2004: This document is out of date and not compatible with the most recent version of the MPL. However, it still makes for an interesting read, so I'll leave it around. Contributions by: Jaap Suter, Dave Abrahams, Terje Slettebo, Aleksey Gurtovoy, Dirk Gerrits Errors by: Jaap Suter (so if you find one, blame me at J_Suter-at-telus.net (where -at- equals @) or correct it in the
このページについて C++関係の話に出てくる言葉で、「読んで字の如し」 とはいかない難解語の簡単な解説を並べてみました。Glossaryというより、 むしろ略語辞典になってしまいました。巷で見かけた単語を並べているだけなので、 実際の所ほとんど使われない略語もあったりするかもしれません。 ちゃんとした用語集は Bjarne Stroustrup's C++ Glossary などをご覧になることをオススメします。 用語集 ADL (Argument Dependent name Lookup) 引数に依存した名前の探索。 Argument Based Lookup, Koenig Lookup とも呼ばれる。 #include <iostream> #include <string> ... std::string s; std::cout << s << std::endl; // os
今日は、TypeTraitsという概念についての自分の理解をまとめておきたい。 少なくとも、Traitsとは、型情報保持クラスとして使えるものである。具体的には、 template< class A, class B > class Traits { public: typedef A Atype; typedef B Btype; }; といったものが、例えばそうである。 これは何か。 これは、Traits クラスが具現化された時点で、その中のtypedef が実行されるというだけの仕掛けである。この一見とるに足らない仕掛けがどう便利なのか? 例えば、A, B, C という3つの型をその型引数としてわざわざ受け取らなくてはならないテンプレートクラス、もしくはそのようなテンプレートクラスのファミリーがあった場合、それらのクラスは皆、上記のTraitsクラス型を一つだけ、その型引数にとるよう
CRTPについてちまちま書いていたのをまとめてみました. CRTP(Curiously Reccursive/Reccuring Template Pattern)とは以下のように基底クラスのテンプレート引数として自分自身を代入するテクニックのことを指します. template class Base{/*.....*/}; class C : public Base{/*.....*/}; よく見かけるパターンなので,これがどういう使われ方をしているかを適当にまとめてみました. あるクラスの機能の一部を変えてコードの再利用を行う場合,変えたい機能を提供するメンバ関数を仮想関数にしてそれを派生クラスでオーバーライドするのが通常の方法ですが,CRTPを使えば仮想関数を用いずに行うことができます. 自分で何か良さそうな例を書こうと思ったのですが,あんまり適切な例が思い浮かばないので,このCRTP
話のネタはありながら、気が付けば木曜日となり、どうやら毎週木曜日に書くという習慣が自分の中に根付いたようです。 さて今日はC++の話です。ActiveBasicもバージョン5で色々と変わりそうですが、C++も目下新規格の制定に向けて話が進んでいます。その新規格は現在のところ、C++0xと呼ばれています。勿論200x年中の制定を見込まれているからですが、最近ではC++09という言葉もちらほら見かけ始めている気もします。 なお、そんなC++0xの様子はC++の標準化委員会のページで窺い知ることができます。 http://www.open-std.org/jtc1/sc22/wg21/ JTC1/SC22/WG21 – The C++ Standards Committee その中でも今回紹介したいのはムーブセマンティクス (move semantics)と右辺値参照 (rvalue refer
C++0xの概要はこちら ・Angle bracket テンプレートの連続した山カッコの問題の解決 ・初期化子リスト ユーザー定義のクラスで配列のような初期化構文を実装可能になる ・Uniform initialization コンストラクタの構文と初期化子リストの構文が一様になる ・デリゲーティング・コンストラクタ コンストラクタから他のコンストラクタを呼び出せる ・auto 型推論 ・記憶クラス指定子としての auto の削除 autoキーワードの意味が変更になるため、下位互換がなくなる ・decltype sizeofの型版 ・Template Aliases テンプレートを使用して型の別名を付けることができる。いわゆるtemplate typedef ・拡張sizeof 構造体/クラスのメンバをインスタンス化せずにsizeofすることが可能になる ・nullptr ヌルポインタを表
コピー(一時オブジェクト)を作成せず、ポインタの移動しようというもの 移動されたオブジェクトは破壊される(関数の戻り値等の右辺値は破壊しても全く問題ないでしょ) 一時オブジェクトを作らないので、より高速で無駄のないプログラミングができるようになる struct string { // copy semantics string(const string& s) : data_(new char[s.size_]), size_(s.size_) { memcpy(data_, s.data_, size_); } string& operator=(const string& s) { if (this != &s) { if (size_ < s.size_) // get sufficient data buffer size_ = s.size_; memcpy(data_, s.d
私は「Boostを使って」ではなく「Boostを作って」勉強している 仕事ではBoostを使いたくても使えないことが多いだろう (「フリーのライブラリなんて使っちゃダメ」とか言われて) そこで、Boostの必要なもののみを作って使用している 各機能をヘッダーファイル1本で提供できるので移植もしやすいだろう このブログで紹介したものを以下にまとめる(※随時更新) 【Boost本家】 Boost C++ Libraries Boost C++ Libraries(cppllによる翻訳) 【Boostからの移植】 ・shared_ptr 参照カウント付きスマートポインタ ・shared_array 参照カウント付きスマートポインタの配列版 ・array 固定長配列 ・lexical_cast 数値と文字列の相互変換 ・type_traits 型特性 ・scope_guard ・static_as
2. C プリプロセッサ 本章では、プリプロセッサに新たに加わったいくつかの機能と、プリプロセッサに対する変更点について説明します。 2.1 新しいコメント表記方法 今までのプログラミング言語 C でのコメントの表記法は、/* */ という表記を用いていました。次の例では、青色の部分が示している部分、つまり /* で始まり */ で終わる部分がコメントとして扱われました。 /* * 引数一覧表示プログラム (c)1999 seclan * ver1.00 1999/03/15 最初のバージョン */ #include <stdio.h> int main(int argc, char *argv[]) { int i; for(i = 0; i < argc; i++){ printf("%d: %s\n", i, /* 添え字。今何番目を 表示しているか */ argv[i] /*
TODO: ampleeを使ってAPIをたたいてみる はてなダイアリーAtomPubとは - はてなキーワード 本ドキュメントに関する注意事項 本ドキュメントははてなダイアリーにおける Atom Publishing Protocol の仕様を解説するものです。主にはてなスタッフがその作成と更新を行っています。 変更履歴 2008年8月28日 リリース 2008年9月2日 認証方式からCookieを廃止、WSSEのみに Atom Publishing Protocol とは Atom Publishing Protocol(以下 AtomPub) はウェブリソースを公開、編集するためのアプリケーション・プロトコル仕様です。はてなダイアリーのAtomPubと通じて、開発者ははてなダイアリーの日記を参照、投稿、編集、削除するようなオリジナルのアプリケーションを作成することができます。 Atom
http://d.hatena.ne.jp/Cryolite/20051021#p1 の問題に対する解答. まず大前提として,未初期化な領域に配置構文 new を用いてオブジェクトを構築する手法は潜在的な危険が多く,本当にそれが必要な場合以外は用いないという方針が基本であることを確認しておいてください. まず最初に自動変数として(スタック上に)確保した char の配列に任意のオブジェクトを構築する場合についてです. class MyClass { ..... }; int main() { char buf[sizeof(MyClass)]; MyClass *p = static_cast<MyClass *>(static_cast<void *>(buf)); ::new (p) MyClass(); ..... // #1 p->~MyClass(); }上のコードはアラインメン
Boost.Functionの実装方法はいくつかのサイトで紹介されているので(こことかここ) 私もBoost.Functionの実装技術について解説しよう Boost.FunctionではType Erasure(型削除型消去)というテクニックが使用されている 実際にBoost.Functionを作りながら解説しよう Boost.Functionは関数ポインタと関数オブジェクトを保持するようになっているので 今回は以下の使い方ができるように実装する int func(); struct func_obj { int operator()(); }; // 関数ポインタ・関数オブジェクトの保持 function<int> f1 = func; function<int> f2 = func_obj(); // 関数ポインタ・関数オブジェクトの実行 int result_func = f1()
「超汎用関数ポインタ」のコメントより boost::functionは難しくてギブアップ・・・ 可変長のオーバーロードをどうやって解決しているのか が知りたかったんだけど、 (以下略) C++ の真骨頂はプリプロセッサとテンプレートを駆使したメタプログラミングにある。メタプログラミングこそが、C++ を他言語の追随を許さない超言語に押し上げていると共に、比類なき難度を持った言語にしている。 boost::function も、そこそこにメタしている実装のひとつだ。 とりあえず、プリプロセスされていない状態では理解が難しいので、プリプロセスだけ実行する。そうすれば格段にソースコードは読み易くなる。Visual C++ なら「/E」「/PE」「/EP」コンパイラオプションを使うと、プリプロセスした結果が得られる。 以下は、boost::function をプリプロセスした結果の抜粋だ(実装は省
コンパイラにとって、「関数(invoke)」の方が「仮想関数を含むクラス(holder)」よりも実装が簡単なのでコードサイズが小さくなる 対象が関数のみであるということを利用して汎用的な解決策である仮想関数の利用を避けることができる []#include[][] <iostream>[] []#include[][] <memory>[] []#include[][] <boost/type_traits.hpp>[] []#include[][] <boost/mpl/if.hpp>[] []using[] []namespace[] []std[]; []struct[] []my_function[] { []int[] []operator[]()([]double[], []float[]) []const[] { []wcout[] << []L[][]"my_function
¤³¤ì¤Ï boost ¥é¥¤¥Ö¥é¥ê¤Ç»È¤ï¤ì¤Æ¤¤¤ë¡¢ ¥¸¥§¥Í¥ê¥Ã¥¯¥×¥í¥°¥é¥ß¥ó¥°µ»½Ñ¤ÎÉÔ´°Á´¤Ê³µ´Ñ¤Ç¤¢¤ë¡£ Table of Contents Introduction The Anatomy of a Concept Traits Tag Dispatching Adaptors Type Generators Object Generators Policy Classes Introduction ¥¸¥§¥Í¥ê¥Ã¥¯¥×¥í¥°¥é¥ß¥ó¥°¤Ï¥½¥Õ¥È¥¦¥§¥¢¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ËÈÆÍѲ½¤Ë´Ø¤¹¤ë¤â¤Î¤Ç¤¢¤ê¡¢ ¤³¤ì¤Ë¤è¤ê¥³¥ó¥Ý¡¼¥Í¥ó¥È¤ò¿Íͤʾõ¶·¤ÇÍưפ˺ÆÍøÍѤ¹¤ë¤³¤È¤¬½ÐÍè¤ë¡£ C++ ¤
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く