タグ

c++に関するkamipoのブックマーク (128)

  • モダン C++ プログラミング - 日本語公開記事 - Confluence

    このドキュメントはサイボウズ社内のトレーニング用に作成したものです。 作成時点では C++11 はまだあまり利用できない状況でしたので、C++98 ベースの記述になっています。 いずれ更新を予定しています。 モダンの定義モダンとはテンプレートメタプログラミング(TMP)を駆使することです。嘘です。 宗教論争に意味はないので、ここでは 「最近の C++ の仕様・機能を理解し、C より実装効率が良く不具合の少ない」 プログラミング技法を「モダン C++ プログラミング」と定義します。 つまり、不具合が少なく、かつ C にはもう戻れなくなるような効率の良さを達成するものです。 学習効率(ROI)が極めて良くないような技法(例えば TMP)は、この定義では除外されます。 勉強方法お勧めの順序は以下。決して全部を読もうとしないこと。 C++ Language Tutorial のような、あっさりした

    kamipo
    kamipo 2013/12/18
  • C++11 スマートポインタの話 - ここは匣

    C++にはガーベジコレクタが言語的には存在しないので、動的に確保したオブジェクトのメモリの管理はプログラマが責任を持って管理しなければ、メモリリーク・リソースリークなどの問題を生じてしまいます。 今時のプログラマはこうした問題を引き起こすリスクを減らす為に、記述ミスの起こりやすい生のポインタを使い自力でnewとdeleteを記述する事を避けて、安全なスマートポインタ、即ちオブジェクトの寿命により自動的にメモリ解放を行う便利なポインタを利用するべきです。 しかし、スマートポインタと言っても種類が幾つかあり、落とし穴も存在するのでどういった状況でどれを利用するのが良いのかを考察してみます。 Dynamic memory managementを見てみても C++11から随分増えていますね http://en.cppreference.com/w/cpp/memory std::auto_ptr

    C++11 スマートポインタの話 - ここは匣
    kamipo
    kamipo 2013/03/26
  • constexpr を使うべき5の理由 - まとめ&リンク集 - ボレロ村上 - ENiyGmaA Code

    「constexpr を使うべき5の理由」の連載をひとまず終えたので、記事の一覧をここにまとめておきます。 また、その他の資料や情報へのリンクを載せておきますので、更に興味あるという方は読んでみるのもよいでしょう。 constexpr を使うべき5の理由 1.定数を明示的にコンパイル時定数にする なぜあなたは const 修飾よりも constexpr 指定をするべきか。 2.定数を返す関数をコンパイル時定数にする 「市民、あなたは constexpr ですか」 「もちろんです、C++。constexpr であることは市民の義務です」 3.副作用がないことを保証する 参照透明な世界に行きたい。 4.あのうんざりするテンプレートメタプログラミングによる数値計算からはもはや解放された 型には TMP、値には constexpr。 5.必要なものをなるべく早く用意しておくために 「C++ のこと

    constexpr を使うべき5の理由 - まとめ&リンク集 - ボレロ村上 - ENiyGmaA Code
  • C++言語 パフォーマンス - redstrange Wiki*

    何か気付いた点があれば、追記をよろしくお願いします。 参考 http://www.open-std.org/JTC1/SC22/WG21/ http://www.open-std.org/JTC1/SC22/WG21/docs/TR18015.pdf http://www.s34.co.jp/cpptechdoc/article/sizeof/index.html 参照 - reference 自前のクラスなどの場合、参照を使う方が早い 組み込みの型の場合、参照を使わない方が早い 名前空間 - namespace 名前空間が、パフォーマンスには影響を与えることはない。 メモリ的にも実行速度的にも。 ただし 関数などの識別子を短くすることの妨げになることがある メモリ上の配置が変わる可能性もある キャスト - cast C表記、C++表記いずれにしても一時的なオブジェクトが作られる可能性があ

    C++言語 パフォーマンス - redstrange Wiki*
    kamipo
    kamipo 2012/12/21
  • privateメンバに外部から非侵入的にアクセスする - redboltzの日記

    はじめに C++では通常、クラスのprivateメンバに外部からアクセスすることができない。 アクセスするためには、friend関数やfriendクラスを用いる。 しかし、 http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html で話題となり、Daveが、 https://gist.github.com/1528856 にエッセンスを抽出したコードを起こしているが、privateメンバに外部から合法的にアクセスする方法がある。 Daveのコードのコメントだけで必要十分かもしれないが、私は理解するのにかなり時間がかかってしまったので、その経緯を忘れないためにもここに書いておきたいと思う。 メンバポインタの復習 まずは、このコードを見て欲しい。 http://ideone.com/dGRqg

    kamipo
    kamipo 2012/12/21
  • C++でメンバ関数テンプレートを仮想関数にできないのは何故? - zakio.net

    C++ でメンバ関数テンプレートを仮想関数にしようとして、コンパイラに怒られた経験がある人は多いと思う。 class Hoge { public: template <typename T> virtual void Func(const T& in) {} // メンバ関数テンプレートは仮想関数にできない }; こういう場合、クラスを丸ごとテンプレート化してしまえば何とかなる場合が多いので、どうしてもという時は設計を見直すことになるだろう。こうすれば仮想関数でテンプレート引数の型が使えるようになる。 template <typename T> // テンプレートクラスにすれば、仮想関数で T が使える class Hoge { public: virtual void Func(const T& in) {} }; 仮想関数ではないメンバ関数テンプレートや、テンプレートではない仮想関数は

    kamipo
    kamipo 2012/12/21
  • C++のSTLアルゴリズムには関数ポインタよりも関数オブジェクトを渡そうという話 - ぬいぐるみライフ?

    C++のalgorithmヘッダーで宣言されているSTLのアルゴリズム関数テンプレートには,引数に関数ポインタや関数オブジェクト(ファンクタ)を取るものが多い. 例えば,引数が一つの関数を受け取るstd::transformは以下のコードと等価である. template <class InputIterator, class OutputIterator, class UnaryOperator> OutputIterator transform (InputIterator first1, InputIterator last1, OutputIterator result, UnaryOperator op) { while (first1 != last1) *result++ = op(*first1++); return result; } transformの引数opには関数ポ

    C++のSTLアルゴリズムには関数ポインタよりも関数オブジェクトを渡そうという話 - ぬいぐるみライフ?
    kamipo
    kamipo 2012/12/21
  • C++と Pthreads でミニマルなHTTPサーバを書く - いやなブログ

    C++と Pthreads でミニマルなHTTPサーバを書く 『UNIXネットワークプログラミング』を読んでいると、自分でも何かネットワーク系の小さなプログラムを書いてみたくなりました。そこで、ミニマルなHTTPサーバを C++と Pthreads で書いてみました。 同じ著者の「詳解UNIXプログラミング」もそうだったように、今回のもほとんどすべてのページに、重要なことが書かれています(最後のほうのXTIの部分は例外かもしれませんが)。 たとえば、27章ではネットワークサーバの実装として、次の設計方針がそれぞれ検討され、実際のコード付きで解説されています。 クライアントごとに fork 事前に fork - 各プロセスで accept 事前に fork - ファイルロックで accept を保護 事前に fork - Mutex ロックで accept を保護 (PTHREAD_PRO

    kamipo
    kamipo 2012/12/21
  • 本当は怖くないムーブセマンティクス - yohhoyの日記(別館)

    この記事はC++ Advent Calendar 2012の15日目にエントリしています。 内容はC++11「ムーブセマンティクス」の入門記事となっています。 もくじ ムーブセマンティクス再考 シンタックス vs. セマンティクス コピー vs. ムーブ ムーブのもつ2つの意味 C++11のムーブセマンティクス対応 auto_ptrからunique_ptrへ auto_ptrの暗い過去 unique_ptrへの移行 std::moveの役割 ムーブセマンティクスを使おう C++11標準ライブラリとムーブ ムーブ"後"の中身は? ムーブを利用して関数を書く (文のみ約9500字) まえがき To move or not to move: that is the question. ― Bjarne Stroustrup, 2010(改)*1 プログラミング言語C++の新しい国際標準規格*2

    本当は怖くないムーブセマンティクス - yohhoyの日記(別館)
    kamipo
    kamipo 2012/12/16
  • 何でもかんでも virtual にしてはいけない

    イントロダクション 派生される可能性があるクラスではデストラクタを virtual にすることは C++ の基事項としていいでしょう。しかし、その知識を持ってはいるけどいまいち virtual を理解していなくて、何でもかんでも virtual にしてしまう、というのではいけません。そういう人のために、ここでは virtual を使ってはいけない場合について書きます。 何のために virtual があるのか さて、メンバ関数を virtual 宣言すると、そのクラスに対し vtable と呼ばれるテーブルが作られ、隠しメンバとして vtable へのポインタが追加されます。vtable は virtual 宣言されている関数のアドレスを集めたテーブルであり、vtable へのポインタは 32bit 環境なら大抵 4 byte になります。つまり、クラスの中に virtual 宣言されたメ

    kamipo
    kamipo 2012/03/06
  • カスタムメモリマネージャと高速なメモリアロケータについて

    2. 自己紹介 ハンドルネーム alwei Twitter ID @aizen76 alweiもしくはaizenのどちらかを使っています 流浪のゲームプログラマ Wii、DS、PSP、PS3、3DSゲームとか作ってた 2Dゲーム好きなのに、実は3Dゲームしか作ったことがない 最近触手軍団に仲間入りして、オンラインゲームを作り始めました アジャイルとかTDDとか勉強中

    カスタムメモリマネージャと高速なメモリアロケータについて
    kamipo
    kamipo 2012/02/12
  • https://sleepy-yoshi.hatenablog.com/entry/20111002/p1

    https://sleepy-yoshi.hatenablog.com/entry/20111002/p1
    kamipo
    kamipo 2011/11/04
  • ヘッダファイルでの定義と分割コンパイル - Cube Lilac

    ヘッダファイルに関数などの(宣言ではなく)定義を記述している場合の,分割コンパイルを行ったときの挙動をイマイチ把握していなかったので整理してみました. C/C++ では,多重定義エラーを防ぐために,ヘッダファイルを記述するときにはインクルードガードと呼ばれるテクニックを使用します.ですが,インクルードガードはコンパイル単位内でのみ有効なテクニックであるため,複数のソースファイルを分割コンパイルする場合には,以下のように多重定義エラーとなる問題が発生します. hello.h #ifndef HELLO_H #define HELLO_H #include <iostream> extern void proxy(); void hello() { static int count = 0; std::cout << "Hello, world! (called: " << count <<

    ヘッダファイルでの定義と分割コンパイル - Cube Lilac
    kamipo
    kamipo 2011/11/03
  • More C++ Idioms/奇妙に再帰したテンプレートパターン(Curiously Recurring Template Pattern) - Wikibooks

    意図[編集] 派生クラス自身をテンプレート引数として、基クラスを特殊化する。 別名[編集] CRTP 上からの混入(Mixin-from-above) 動機[編集] 型には依存しないが、型別にカスタマイズ可能な機能を基クラスから抽出し、それらインタフェース、属性、動作を派生クラス用にカスタマイズしてから、派生クラスに混入(mix-in)させる。 解法とサンプルコード[編集] 典型的には、基クラステンプレートは、メンバ関数の体(定義)はその宣言から非常に後になるまでインスタンス化されないという事実を活用する。そして、そのメンバ関数中で派生クラスのメンバ関数を、static_cast経由で利用する。例えば template <class Derived> struct base { void interface() { // ... static_cast<Derived*>(this

  • RVO (Return Value Optimization)についてのメモ - nokunoの日記

    Efficient C++を呼んでいたら,RVO (Return Value Optimization)が適用されるコードと適用されないコードの例が紹介されていました.RVOというのは,C++で関数がオブジェクトを返す場合に,一時オブジェクトの生成とコピーを抑制するコンパイラの機能です.非常に興味深いですね.Amazon.co.jp: Efficient C++パフォーマンスプログラミングテクニック: ダブ ブルカ, デビット メイヒュ, 浜田 光之, Dov Bulka, David Mayhew, 浜田 真理: RVOが適用されないコード Complex operator+ (const Complex& a, const Complex& b) { Complex retVal; retVal.real = a.real + b.real; retVal.imag = a.ima

    kamipo
    kamipo 2011/10/20
  • priority_queueを使って要素を小さい順に取り出す - ぬいぐるみライフ(仮)

    C++ STLのsetやmapの場合は要素を小さい順にソートするけど,priority_queueは要素を大きい順に並べる. priority_queueの定義はこんな感じ. template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue; ここで紛らわしいのは,Compareにはデフォルトでlessが割り当てられるけど,priority_queueはこれを使って要素を大きい順に並べること.指定するCompareと実際のソートの仕方が逆で直感的じゃない.要注意. 要素を小さい順に取り出したい場合は以下のようにgreaterを指定しなければならない. priority_queue<int, vector<int

    priority_queueを使って要素を小さい順に取り出す - ぬいぐるみライフ(仮)
    kamipo
    kamipo 2011/09/08
  • C++の行列ライブラリ Eigenの紹介 - Preferred Networks Research & Development

    C++で行列計算をする場合に便利なライブラリEigenを紹介したいと思います。 ベクトル・行列演算は知っているからEigenの使い方だけを教えてくれというかたは最初の章は読み飛ばしてください。 — 多くの統計処理がベクトル・行列演算を用いるとコンパクトに表すことが知られています。ちょっと複雑そうにみえる問題も整理してみるとベクトル・行列演算で書ける場合が多いです。(ベクトル・行列という言葉に抵抗がある方はそれぞれを単に配列、配列の配列とでも思ってもらえればいいでしょう)。ベクトルの内積は\(u^T v = u_1 v_1 + u_2 v_2 + \ldots +\)として求められ、ベクトルのノルムは自分自身のベクトルとの内積の平方根、\(|u| = \sqrt{ u^T u} \)として求められます(以降ベクトルは全て列ベクトルを指すとします)。 例えば、あるユーザーの商品の購買履歴は、\

    C++の行列ライブラリ Eigenの紹介 - Preferred Networks Research & Development
  • sexyhook - Project Hosting on Google Code

    Code Archive Skip to content Google About Google Privacy Terms

  • You - 雲丹のごった煮

    g++でプログラムを組んでいて、意外に実行速度の邪魔になるのが例外処理のスタック巻き戻しコード。 スタック巻き戻しコードとは、ある関数が他の関数を呼び出し、呼び出し先で例外が発生した場合に、呼び出し元が実行すべきデストラクタを津々浦々、粛々と呼び出すためのコード。 通常、関数に入ったところでデストラクタ呼び出し部分を登録して、関数を出るところで登録を抹消する。 例えばこんなコード。 class C { public: ~C(); }; void bar(); void foo() { C c; bar(); } g++ -O2 -S とすると、こんな長いコードが生成される。ちなみにCygwin付属のgcc 3.4.4にてコンパイル。 __Z3foov: pushl %ebp movl %esp, %ebp leal -24(%ebp), %eax subl $120, %esp movl

  • Tamarin での文字列 - steps to phantasien(2008-08-31)

    2008-08-31 近況 LL Future というイベントに呼んで頂き, 中野へ. 前日の激しい雷で眠りが浅く寝坊したら, 基調講演は Larry Wall だったらしい. 聞き逃した. なんてこったい... そしてサインを貰う準備もしていなかった. 昼飯をべる暇があったら紀伊国屋に駆けこむんだったといまだに後悔している. おしいことをした. 宴会でゴルフ場経営者に見せてもらった サイン実物はとても気が利いたもので, まったくうらやましい. 彼のは年季が入った版の上にかなり読みこまれた形跡があったので, Larry Wall も嬉しかったことだろうな. 私もいつか実現するであろう Stroustrup の来日に向け, 件のを読み込んでおかねばなるまい. パネルの内容は shibuya.js 番外編というかんじで, JS や ActionScript の上で実装した処理系の紹介を中