タグ

C++に関するy_rのブックマーク (120)

  • Type Erasure(型消去)を使って何でも格納できる型を作成する - My Life as a Mock Quant

    要するにVBAでいうVariant型的な物をC++でどう作るのかというお話。この問題に対する設計の定石としては以下のようなクラスを設計することで対応する。 今回は”代入できる”という機能だけ作成。ここにtemplateで指定した型が持つべき関数を規定・制限したり、各種型へのキャストを用意すれば「特定のインターフェイスをもった型だけを格納できる型」として使うこともできて大変便利。Boostライブラリではshared_ptrやその名の通りのanyの実装のために使われている技法。 #include<iostream> using namespace std; //自作のAny型 class Any { public : template<class T> Any(const T & x) : _x(new Any_Derived<T>(x)){} ~Any(){delete _x;} priva

    Type Erasure(型消去)を使って何でも格納できる型を作成する - My Life as a Mock Quant
    y_r
    y_r 2013/01/17
    なるほど。
  • C++11時代のthreading - fjnlの生存記録のような何か

    始めに 記事は C++11 Advent Calendar 2011 : ATND の6日目です。 std::thread C++11時代のthreadの基は std::thread です。おもむろに #include をしましょう。std::threadはコンストラクタで渡された関数オブジェクトを別スレッドで実行します。 #include <iostream> #include <thread> void f() { std::cout << "f()" << std::endl; } int main() { std::thread thr(f); thr.join(); return 0; } このプログラムを実行すると f() と表示されるはずです。コンパイルして実行してみます。 $ g++ -o thr thr.cpp -std=c++0x $ ./thr f() $ 確かに

    C++11時代のthreading - fjnlの生存記録のような何か
    y_r
    y_r 2012/11/06
  • 条件変数とダンス(Two-Step Dance)を - yohhoyの日記

    条件変数(condition variable)同期プリミティブに対する待機/通知で発生する現象と回避策のメモ。 条件変数とミューテックスを使ったコードにおいて次のような現象が生じる。 スレッドAが条件変数cvに対して通知を行う。 条件変数cvに対してブロックされていたスレッドBのブロックが解除される。ただし、ミューテックスmtxはスレッドAにロック保持されたままのため、再びスレッドBはミューテックスmtxに対してブロックされる*1。 スレッドAがミューテックスmtxのロックを解放する。 ミューテックスmtxに対してブロックされていたスレッドBがブロック解除され、同ミューテックスのロック獲得に成功する。 #include <pthread.h> int data = 0; // 待機条件: 非0になるまで待機 pthread_mutex_t mtx; pthread_cond_t cv;

    条件変数とダンス(Two-Step Dance)を - yohhoyの日記
    y_r
    y_r 2012/06/28
    解放スレッドがロックリリース前に待機スレッドが起動すると無駄な待機が発生する
  • Very Sleepy

    codersnotes Very Sleepy is a free C/C++ CPU profiler for Windows systems. I originally started it as a simple fork of Nick Chapman's sleepy, because I had some features I wanted adding, but these days Very Sleepy is developed thanks to the efforts of dozens of people who work to contribute to it. It supports any native Windows app, if it has standard PDB or DWARF debugging information. No recompil

    y_r
    y_r 2012/05/23
    OpenSource のプロファイラ (サンプリング方式)
  • 「憂鬱なプログラマのためのオブジェクト指向開発講座」はどうトンデモなのか - K.Maebashi's はてなブログ

    前回の続きです。 なお、私が持っているのは初版第10刷、正誤表がこちらにあるようです。 この人、Cで開発したことあるのかな オブジェクト指向の教科書ではよくあることですが、このも、Cによる開発とオブジェクト指向言語(このの場合はC++)による開発を対比し、「C++の方がこんなにいいでしょ」という説明が随所にあります。そのこと自体は悪いことだとは思いません。 しかし、そういうことを書くなら、Cによるまともな開発についての知識が必要なんじゃないでしょうか。 p.30 クラスの宣言は一般的にヘッダファイルに記述します.C言語でのプログラミングでは,ヘッダファイルをプログラマが書く機会というのはあまり多くありませんでしたが,C++ではクラスを作るたびにヘッダファイルを書くことになります. いや、当に当の入門者でない限り、Cプログラマだってヘッダファイルぐらい書きますってば。ていうか、経験を

    「憂鬱なプログラマのためのオブジェクト指向開発講座」はどうトンデモなのか - K.Maebashi's はてなブログ
    y_r
    y_r 2012/01/19
    "末尾スペース除去可能文字列クラス"w
  • 私立C++女学園 マルチスレッド科 - yamasaのネタ帳

    ここは私立C++女学園。 由緒あるこの学園も、時代の流れに押され大きな変革の時を迎えていた。新たに学園に設けられることとなった「マルチスレッド科」。物語はここから始まる…… 登場人物 memory_order_seq_cstさん 学級委員長。どんなことも完璧にこなす優等生であり、先生や他の生徒からの信頼も厚い。ただ、あまりの完璧主義者ゆえに、何でも全て順番どおりにやらないと気が済まないところが、ある意味欠点でもある。 memory_order_releaseさんとmemory_order_acquireさん シンクロナイズドスイミング部に所属する双子の姉妹。二人の息の合ったシンクロ演技には、部内に限らずファンが多い。学園内では、memory_order_seq_cstさんと人気を二分していると言ってよいだろう。 memory_order_acq_relさん あまり目立たない生徒だが、実はm

    私立C++女学園 マルチスレッド科 - yamasaのネタ帳
    y_r
    y_r 2011/04/11
  • C++/CLIなら面倒は無い? - NyaRuRuが地球にいたころ

    引用元はこの辺かな. また,システムグローバルなキー入力の監視方法には主に3通りあります. (フィルタ)ドライバの作成 キーボードフックの使用 低水準キーボードフックの使用 有名な『窓使いの憂』は1を,かおくさんから紹介があった『Xkeymacs』は2を使用しています. 1 は最も強力ですが最も手間がかかります.2は特定アプリケーションのみを監視するのには便利ですが,フックハンドラは DLL に実装しなければならないため .NET での実装上問題があります.また,2ではAlt+Tab などの一部のキーストロークはフックできません.3は使用可能環境に Windows NT 4.0 SP3 以降という制限がありますが,キーボードドライバや SendInput API によって入力された直後をフックすることが出来ます.また3はフックハンドラを DLL に置く必要がないという特徴があり,.NET

    C++/CLIなら面倒は無い? - NyaRuRuが地球にいたころ
    y_r
    y_r 2011/02/18
    思いっきりダメだしされてるコードがあった。いまから修正検討を行う。
  • 動的削除子 (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
    y_r
    y_r 2010/11/28
    shared_ptr の利点について
  • 本の虫: 邪悪なC形式のキャストにしかできないこと

    注意:邪悪で汚らわしいC形式のキャストは、いやしくもC++プログラマたる者は、使うべからず C++では、玉虫色のC形式のキャストの機能を、三つに分割した。static_cast、reinterpret_cast、const_castである。しかし、この三種のキャストでは、C形式のキャストを完全に代替できないという声をよく聞く。曰く、「どうしても書けないキャストがある」と。 それはよく聞く話だが、では実際にどのようなキャストなのかということは、誰も審らかにしない。誰も知らないキャストであれば、特に使えなくても問題ないはずだ。ただし、「C形式のキャストならばできるキャストが、新しいキャストを組み合わせてもできない。どんなキャストかは知らないが、とにかくできないと聞いている。故に新しいキャストはクソだ」などという論調で、C++の改良されたキャストを使わぬC畑の外道がしゃしゃり出てくるのも困る。そ

    y_r
    y_r 2010/07/28
    C 形式のキャストはアクセス指定を超越してしまう / メンバーへのポインタってこういう書き方するのか。
  • 「プログラミングの魔導書」の情報公開 - Faith and Brave - C++で遊ぼう

    http://longgate.co.jp/products.html 弊社、株式会社ロングゲートで、プログラミング雑誌を作るというプロジェクトが進行しています。 書創刊の目的は、プログラミングの入門記事が巷に溢れる今、プログラマのさらなる成長のため情報発信を行い、業界全体の技術力を向上させることです。 雑誌といっても、記事の質を保つために不定期刊行としていることから、実際には雑誌ライクな書籍となります。 書籍名は「プログラミングの魔導書〜Programmers' Grimoire〜」です。 創刊号となる今回のテーマは、サブタイトルにも含まれている「C++」です。全ての記事がプログラミング言語C++に関するものとなっています。 Vol.1のテーマをC++としたのは奇をてらったものではありません。 C++は習得の難しい言語と言われておりますが、近年はBoost C++ Librariesに

    「プログラミングの魔導書」の情報公開 - Faith and Brave - C++で遊ぼう
  • C++ Labyrinth

    オーバーロードは継承できない これは、おそらく、C++ プログラマなら誰しも驚いた経験していることであり、 もし、あなたが未経験であってこの文章を読んで知識を仕入れておいたとしても、 きっといつかは体験して驚くことになるであろう、C++ の一仕様の話である。 いささか仰々しい書き出しになったが、今回の話題は、 「基底クラスと派生クラスで同じ名前の関数が定義されていた場合、 基底クラスの関数は隠されてしまう」という、C++ の仕様のことである。 ここで、「同じ名前なら隠されるのは当り前やんか」と思ったあなたは、 ちょっと読みが甘い。「同じ名前」というのは、文字通り、 「関数名だけが一致している」 ということであって、引数など、 シグネチャを構成する他の要素は違っていても構わないのだ。 例をあげよう。 class Base { public: int foo( int x ); }; clas

    y_r
    y_r 2010/06/01
    親のを参照しない理由。親の親の親の…を見落とす可能性があるから、新規メソッドのはずがオーバーロードになるのを防止
  • 継承をまたいだオーバーロードは出来ない!? - みねこあ

    手っ取り早くコードから。 class Base { public: void foo(void) { cout << "base" << endl; } }; class Sub : public Base { public: void foo(int) { cout << "sub" << endl; } }; int main( void ) { Sub sub; sub.foo(); sub.foo(42); return 0; } のコード、基底クラスのメンバ関数 foo(void) のオーバーロードとなる関数 foo(int) を派生先クラスで 定義した場合、直感的には (Base と Sub には is-a関係が成り立つので) 上手くハズなのですが、 main.cpp: In function `int main()': main.cpp:28: error: no match

    継承をまたいだオーバーロードは出来ない!? - みねこあ
    y_r
    y_r 2010/06/01
    親の宣言ぐらい見てくれてもいいのに / using Class::Method で解決
  • template

    演習で使った C++ のテンプレートに関する資料を中途半端ですが公開しときます。暇があってやる気が出たら追加や書き直しをするかも。 テンプレート一般 template の適当な説明 コンパイル時の計算 コンパイル時のコード生成 traits とは policy とは typename は何故必要か

    y_r
    y_r 2010/05/12
    template 簡易説明
  • decltype - Google 検索

    2019/04/15 · decltype は、オペランドで指定した式の型を取得する機能である。 型を指定する必要のある個所で decltype を使用することによって、具体的な型名を指定 ...

    y_r
    y_r 2010/05/12
    この存在を今知った…
  • MSDN ホームページ

    This browser is no longer supported. Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

    MSDN ホームページ
    y_r
    y_r 2010/03/03
    メモリリークの検出
  • メモリリークの自動検出をしてみる - 閑古鳥

    VC++ のライブラリにはメモリリークの検出機能があります。関数ひとつ呼んでおくだけでアプリケーション終了時にメモリの解放漏れを出力ウィンドウに表示してくれるという便利なものなのですが、実際にこれを使うまでの過程に罠が多いのでメモしておきます。長すぎて我ながらわけがわからないので、興味のある方は最後の参考サイトだけ読んだらいいと思います。 使い方 普通に使う分には簡単です。 stdafx.h の末尾*1に : #if _DEBUG #define _CRTDBG_MAP_ALLOC #include <crtdbg.h> #define new new(_NORMAL_BLOCK, __FILE__, __LINE__) #endif と記述し、main 関数 (MFC であれば CWinApp::InitInstanceとか) 内部で ::_CrtSetDbgFlag(_CRTDBG_L

    メモリリークの自動検出をしてみる - 閑古鳥
    y_r
    y_r 2010/03/03
    Windows でのメモリリーク自動検出と罠がいっぱい
  • C++ におけるコードレビューの重要性と活用 - NyaRuRuが地球にいたころ

    そのような場合 C++ では、この関数 g の仮引数 obj に対して const 修飾を行うことで「私 g は obj の参照先の値に対して破壊的な操作を行いませんよ」という宣言を関数 g にさせることができます。 void g(const LargeObj& obj){ ... } void f(){ LargeObj tmp; g(tmp); // tmp に対する変更はない ..... // tmp に対する何らかの処理(安心です!) } やりましたね! C++ のコードにこの種のコメントを残すのは,コードレビュアーの仕事を増やすお手軽な方法のひとつです. 悪性の const_cast や mutable が問題なのではありません.同僚が悪性の const_cast や mutable をコードに紛れ込ませるようであれば,それは採用プロセスの問題です. より現実的な問題は,cons

    C++ におけるコードレビューの重要性と活用 - NyaRuRuが地球にいたころ
    y_r
    y_r 2010/02/03
    一瞬なにやってんのかわかんなかったけど。
  • C++ における const の重要性と活用 - ニートの世紀

    const なんて知らないよ、という層の人間が一定世の中には存在するようです。 そういった人間の大多数の主張は恐らく「面倒くさい」「嫌い」とかだと思うのですが、const 性に気を配るのは C++ においてはメンバ変数を private にしないといけないことと同程度にやらないといけないことです。という話をします。 const というとまず真っ先に出てくるのは「値が変わらないことでコードが読みやすくなる」とか「参照透明性のため」とかで、参照透明とか言葉がすごく綺麗ですごいって感じだと思います。ボクは参照透明という言葉がすごく好きです。 でも C++ は現実の言語なので現実を見ましょう。そんなのどうだっていいんです。 前提として C++ はそれなりに速い何かを作るための言語である、ソースコードはコメントや何らかの形のドキュメントに勝る、という二点をあげておきます。 例えば巨大なオブジェク

    y_r
    y_r 2010/02/03
    const const const
  • gccにおけるatomic操作命令の個別関数

     gccとVC x86/x64環境で開発する上で, gccとVCはどちらも非常に優れたC/C++コンパイラです. ただLinuxWindowsのどちらの環境でも動作するようなC/C++コードを書くためには, gccとVC, およびそれらが動作するOSの違いが問題になることがあります. ここではそれらの違いについてまとめていきたいと思います. なお説明を簡単にするためにマクロを多用していますが実際には可能なら別の手段をとるか, 名前がぶつからないような命名規則に則ったマクロ名をつけることをお薦めします. 対象 定義済みマクロ 有用なマクロ コンパイルオプション 演算子の代替表現の抑制 日語のコメント 型 pragma attributeとdeclspec ファイル入出力 テキストとバイナリ 巨大なファイル static変数の初期化 snprintf 例外ハンドラ intrinsic関数

    y_r
    y_r 2009/09/25
    VC と GCC でソース共有をするために
  • いやなブログ: Cのポインタを整数に変換する

    Cのポインタを整数に変換する Cのポインタを整数に変換したいときがあります。このとき問題になるのは、ポインタのサイズが int と同じとは限らないということです。たとえば、 x86_64 の 64ビットのバイナリでは sizeof(int) = 4, sizeof(void *) = 8 となります。ポインタと同じサイズの整数を使いたい場合は C99 で導入された stdint.h で提供される intptr_t または uintptr_t を使います。 stdint.h には他にも int32_t や int64_t など、サイズつきの整数の型も提供されています。たとえば、uint64_t を使うと、64ビットの符合なし整数を扱うことができます。 私の場合、C++ のプログラムで void * から直接 uint64_t にキャストしようとしてはまりました。次のプログラムを x86_32

    y_r
    y_r 2009/09/18
    ポインタのビット幅問題にわずらわされないために uintptr_t または intptr_t を使え。