タグ

ブックマーク / blog.cryolite.net (5)

  • C++0x Memory Model 第0回 - メモリモデルとは何か

    私は,スカートを履いた女の子に,スカートを履いたままぱんつを脱いで,脱ぎ終わったら右手を挙げるようにと,そう命令した.私は,その子が右手を挙げたのを確かに見た.だが,その子のスカートをめくってみたらぱんつはまだそこにあったのだ! - http://twitter.com/Cryolite/status/8455287843 より一部改変 これは C++ advent calendar の参加記事です。 ブログエントリは,以降のブログエントリと合わせて, C++0x のメモリモデルに関する規則を具体的な例や意味付けを交えた形で説明していくことを目的としています. 1998年に制定され,2003年に改訂された現行の C++ プログラミング言語標準規格 (以下, C++03) においては,プログラム中にただ1つの実行スレッドしか存在しない場合の規定しか記述されていませんでした*1.しかし, C

    C++0x Memory Model 第0回 - メモリモデルとは何か
  • 未初期化な領域とアラインメント - Cry's Blog

    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(); }上のコードはアラインメン

    未初期化な領域とアラインメント - Cry's Blog
  • 任意の expression に透過的に hook を仕掛けるようなマクロが書けるのではありませぬか? - Cry’s Diary

    以下のコードでやっていることの説明. EXCEPTION_HOOK((expr))と書いておけば, (expr) という C++ の式を実行したら急に例外が来たので……というときに, call stack のようなもので殴られた跡 (この hook が仕掛けられている場所に関する情報) を boost::exception に乗せていきます. call stack の生成ぐらい言語でサポートして欲しいよね,うんうん.終わり. Microsoft Visual C++ 2010 と GCC 4.5.0 で動作を確認済みです. 工夫として, EXCEPTION_HOOK((expr))という文字列が式 expr と同等な C++ の expression として透過的に機能するように見せかけてあります.つまり,たとえば std::string s("42"); int i = EXCEPTIO

    任意の expression に透過的に hook を仕掛けるようなマクロが書けるのではありませぬか? - Cry’s Diary
  • 2004-10-27

    うん.なんていうかね.Boost.Serializationのutf8_codecvt_facet.hppとutf8_codecvt_facet.cppの実装を追ってたのよ.(RC枝から引っ張ってきたやつ)いやcoding変換の実装を追うのは楽しかったですよ?何せ実装が極めて素直だから,うにコード超初心者の自分でも教科書さえ手元にあれば「ああ,これはこれね」って感じだったもん. 問題はそこじゃねぇ. このユーティリティ,std::codecvtなる標準のクラスから派生してる.恐らくこのstd::codecvtはただのインターフェース定義.このstd::codecvtから派生したutf8_codecvt_facet_wchat_tをfacetとして突っ込んだlocaleオブジェクト作って(std::codecvtはlocale::facetから派生してる),それでstreamをimbueすれ

    2004-10-27
    tyru
    tyru 2009/06/03
    boostでも使われているワイド文字とそうでない文字の変換の仕組み
  • 動的削除子 (dynamic deleter) - 意外と知られていない? boost::shared_ptr の側面 - Cry’s Diary

    boost::shared_ptr は動的削除子 (dynamic deleter) と呼ばれる技法に基づいて実装されています.この動的削除子という技法で重要なのは, boost::shared_ptr が最終的に呼び出す解放処理が boost::shared_ptr のテンプレート引数の型に関係なく,コンストラクタに実際に渡されたポインタの型で,かつ boost::shared_ptr のコンストラクタの呼び出しの段階で 決定する,ということです. 以下のようなコードが,動的削除子の効果が一番分かりやすい例になるでしょう. class X{ public: ~X() { std::cout << "X::~X" << std::endl; } }; class B{ public: ~B() // virtual でないことに注意!! { std::cout << "B::~B" <<

    動的削除子 (dynamic deleter) - 意外と知られていない? boost::shared_ptr の側面 - Cry’s Diary
    tyru
    tyru 2008/12/26
    boost::shared_ptrはテンプレート引数の型に代入できるものなら何を入れても適切に開放される
  • 1