タグ

C++に関するchezouのブックマーク (42)

  • Halide事始め - プログラミングの実験場

    MIT Halide(http://halide-lang.org/)というC++の高速画像処理ライブラリが去年リリースされた。C++内のDSLを使っていて、画像処理を、 計算のアルゴリズム アルゴリズム自体は副作用がなく、純粋関数的に定義される。 実装の詳細(「スケジュール」) スケジュールは、計算の並列化と、複数の計算ステップの融合を最適化する方法を指定する。 を分離した形で簡潔に書ける。 凄いのは、抽象的に書いたアルゴリズムからライブラリによって低レベルコードを出力させたほうが、手書きでチューニングしたコードよりも速いことすらあること(という作者の主張)。たとえば最近開発されたlocal Laplacian filterというの複雑なアルゴリズム(http://people.csail.mit.edu/sparis/publi/2011/siggraph/、pixelwise ope

    Halide事始め - プログラミングの実験場
    chezou
    chezou 2013/09/13
    "OpenMPとIntel IPPで並列化した手書きのC++よりも2.1倍速く、コードが3.7倍短い" !!
  • アセンブリ読んだら負けかなと思ってる - 誰かの役に立てばいいブログ

    子供のころからできるだけ手抜きして成果を挙げることだけは長けている山です。 今回は、C/C++ で作ったプログラムが運用中にクラッシュするときのデバッグ方法のお話しです。 開発中のデバッグは gdb などでソース追いながらデバッグできますが、運用中ですと strip していたり最適化していたりしてデバッグが難しくなります。 そもそも、いきなりクラッシュすると情報が残らずに困ってしまいます。そんなときどうするか。 Step1. スタックトレースを出力する こんな関数を用意しましょう。Linux 以外の人はそれなりに実装してください。 #include <execinfo.h> #include <unistd.h> void dump_stack() { void* bt[100]; int n = backtrace(bt, 100); backtrace_symbols_fd(bt,

    アセンブリ読んだら負けかなと思ってる - 誰かの役に立てばいいブログ
    chezou
    chezou 2013/07/06
  • -dbg パッケージでライブラリのシンボル情報を得る - daily dayflower

    たとえば libc6 だったら libc6-dbg というのがデバッグ用シンボル情報のパッケージです(Debian 系の場合)。 $ sudo apt-get install libc6-dbg $ sudo apt-get install samba-dbgなにがうれしいか,というと元ソースコードの行とか引数の状況とか gdb で得ることができます。 先ほどのデバッグです。 $ gdb test GNU gdb 6.8-debian ...... snip snip snip ...... This GDB was configured as "i486-linux-gnu"...デバッグシンボルパッケージは /usr/lib/debug 以下にインストールされるので,こちらを優先して読み込むように LD_LIBRARY_PATH 環境変数で指定してあげます。 (gdb) set env

    -dbg パッケージでライブラリのシンボル情報を得る - daily dayflower
    chezou
    chezou 2012/03/08
  • letsboost::optional

    abstract 必要なヘッダ <boost/optional.hpp> 出来ること T型の値を表しているかもしれないし、いないかもしれない型optional<T> リファレンス en / jp sample #include <iostream> #include <boost/optional.hpp> using namespace std; using namespace boost; // √x を越えない最大の整数を返す関数 // ただし、xが負の数の時は、「不正です」という値を返す optional<int> sqrt( int x ) { if( x < 0 ) return optional<int>(); int i; for(i=0; i*i<=x; ++i) {} return optional<int>(i-1); } int main() { for(int j

    chezou
    chezou 2012/03/01
    pficommonのoptionalもこういう使い方のように、ポインタの代わりになるのね
  • MLTL: Machine Learning Templete Library

    MLTL: 機械学習テンプレートライブラリ Introduction MLTL機械学習テンプレートライブラリは,自然言語処理へ機械学習を応用する研究や,より自然言語処理に適した機械学習手法の開発を容易にするため,YANS活動の中で清水伸幸と宮尾祐介を中心として作られた C++ テンプレートライブラリです.特に,系列構造や木構造など,自然言語の構造を表現するのに適した構造に対して,様々な機械学習アルゴリズムを利用できるように設計されています. 設計の特徴として,データ構造を表すクラスと学習アルゴリズムを表すテンプレートクラスを分離し,これらの間をつなぐインタフェースを設定することで,汎用性を高めています.これにより,新たにデータ構造クラスを作成した場合に様々な学習アルゴリズムとの組み合わせを容易に試すことができ,逆に,新たな学習アルゴリズムを実装した場合には様々なデータ構造との組み合わせを試

    chezou
    chezou 2012/02/25
    MIRAなどのC++ライブラリ。 #tokyonlp
  • 並列メッセージングフレームワーク「MessagePack-RPC for C++」リリース - Blog by Sadayuki Furuhashi

    分散KVS kumofs のコードは、全体で約2万行です。 そのうち、ネットワークI/Oやプロトコルに関するコードは約1万行で、全体の約半分を占めています。 並列イベント駆動I/Oフレームワーク「mpio」リリース ネットワークアプリケーションを実装する上で、もっとも大きな障壁は、ネットワークI/Oとプロトコルです。 では、それが両方ともフレームワークでサポートされ、コードを書く必要が無くなったらどうでしょうか? 54行で簡単な分散KVSを実装したり、140行で分散リアルタイム検索エンジンを実装することができます。すなわち、インデックス作成サーバ、検索サーバ、DBサーバなど、多数のサーバが連携し、スケールアウトの恩恵を得ることができるネットワークアプリケーションを、1台のホスト上で動作する並列アプリケーションとほぼ同じように書くことができます。 実装上の問題から解放されれば、並列性や耐障害

    並列メッセージングフレームワーク「MessagePack-RPC for C++」リリース - Blog by Sadayuki Furuhashi
  • C++名前空間

    [ C++で開発 ] C++名前空間 昔C++をかじった頃は名前空間はありませんでした。Javaに手を染めてから標準C++に入ったときに、名前空間を知って、これはJavaのpackageと同じようなものだなぁと思いました。 クラスが増えてくると、クラス名等の名前定義の衝突が考えられます。古くは、定義名の先頭にプロジェクトなどの名称を接頭辞として付与する方法を取っていましたが、名前空間を使用すると効果的な管理ができるようになります。 また、UMLによる設計をしている場合、パッケージを実装するのに名前空間を使います。 名前空間の使用方法 名前空間の中に型定義を行う 名前空間を指定して関数宣言、定数定義、型定義をする場合、namespace 名前 { ... } で囲います。通常これらはヘッダファイルに記述することになります。 namespace torutk { void clear_list

  • GoogleTest + Hudson (Jenkins) な環境作り | ASR's hive

    この週末は、splintpmccabeとは別に、C++環境の調査もしていました。 ユニットテストフレームワークとして、5年前にはCppUnitを使っていましたが、今なら何が良いのでしょうね。 1. GoogleTest導入 使ってみないとわかりませんので、試しにGoogleTestを入れてみました。 v1.5.0です。 インストール時に困るところは特にありませんでした。 解凍 → ./configure → make → make check → sudo make install 1.1. お試し まずはmainを用意します。 testmain.cpp [cpp]#include int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS()

    chezou
    chezou 2012/02/18
    google testくらいは試してみるか
  • ある程度経験を積んだC++プログラマは絶対にvirtualデストラクタのないクラスを継承しない? - 神様なんて信じない僕らのために

    ある程度経験を積んだC++プログラマは絶対にvirtualデストラクタのないクラスを継承しない C++では基底クラスにvirtualデストラクタを書こう - *「ふっかつのじゅもんがちがいます。」withぬこ はよくある間違い。あるいはC++初心者の勘違い。 継承する可能性のあるクラスにはすべてvirtualデストラクタを作る C++では基底クラスにvirtualデストラクタを書こう - *「ふっかつのじゅもんがちがいます。」withぬこ ということが否定されていることは言われるようにEffective C++を読んでいればわかること。 C++では、コピー不可にするために以下のようなクラスを書いたりするが、 (コピーコンストラクタとコピー代入演算子を無効にする) class Uncopyable { protected: Uncopyable() {} ~ Uncopyable() {}

    ある程度経験を積んだC++プログラマは絶対にvirtualデストラクタのないクラスを継承しない? - 神様なんて信じない僕らのために
  • shared_ptrを使おう - ...ing logging 4.0

    当然だがほとんどの後輩がshared_ptrを知らないみたいなので,いつかC++講座で使うための説明用資料としてここに書いておく. 概要 shared_ptrを使うとnewして作成したオブジェクトを明示的にdeleteしなくてもよくなる. 原理的に,どこからも参照されなくなったオブジェクトにアクセスする方法は存在しないので,そのオブジェクトはもう破壊してしまっても問題がない. shared_ptrは,オブジェクトが参照されている数をカウントしておいて(参照カウントと言う),参照カウントがゼロになるときに参照先のオブジェクトを1回だけdeleteしてくれる. shared_ptrはauto_ptrと同じスマートポインタの一種であり,次期C++の標準ライブラリに導入される.それと同時にauto_ptrは非推奨となる. サンプル 環境はSP1を適用済みのVS2008. VS2008SP1を入れて

    shared_ptrを使おう - ...ing logging 4.0
  • 6-6. C++デストラクタによる安全な資源解放

    <body> </body>

    chezou
    chezou 2012/02/18
    例外安全の方法。一つの方法として。
  • 1. boost::weak_ptrを利用するケース|オブジェクトの広場

    1.スマートポインタとは? boost::weak_ptrを利用するケースについてお話しする前に、まず、スマートポインタについての概要をおはなしする必要があります。なぜなら、boost::weak_ptrは、(ちょっと特殊な)スマートポインタの一種だからです。 スマートポインタとは、賢い(スマートな)ポインタという名前の由来からも想像できるかと思いますが、指し示すオブジェクトの後始末を自動化してくれる、ポインタのように振る舞うクラステンプレートのことです。 プログラミング言語C++では、メモリや各種ハンドルなどのリソースの管理にスマートポインタを利用します。スマートポインタを用いることで、リソースの解放が自動化され、リソースリーク問題を防ぐことができます。 残念ながら、現在のC++C++03)標準では、汎用的に利用できるスマートポインタが提供されていません(std::auto_ptrが提

  • [C++]例外安全、new について

    C++ では new をすると、operator new, operator delete でも実装していない限りは、必ず delete をする必要があります。 // 例外安全でないプログラム Hoge* pHoge = new Hoge(); // pHoge を使ってごにょごにょする ... delete pHoge; 普通に new をして領域を確保し、必要が無くなれば delete をするだけのプログラムです。 が、これだけでは必ず delete が出来るという保証はないのです。 これは例外について対処が出来ていなくて、pHoge を使っている途中に例外が発生した場合、pHoge は解放される機会を失い、メモリリークを引き起こします。 なので、次のように書く必要があります。 // 例外安全なプログラム Hoge* pHoge = new Hoge(); try { // pHoge

    chezou
    chezou 2012/02/18
    shared_ptrも癖を知らないといけないのね。しかし、人のモジュール叩く時の例外安全は考えないといけないなー
  • STLプログラミング・メモ

    [ C++で開発 ] STLプログラミング・ノート STLを使いこなすためのノートです。STLは機能豊富で汎用的なライブラリ集ですが、使いこなすには難易度が少々高いので、あらかじめ勉強が欠かせません コンテナの要素にポインタを入れたい ポリモーフィズムを活用するためのコンテナ格納法 オブジェクト指向プログラマーがぶつかるSTLの壁の1つです。 オブジェクト指向プログラミングをする以上、アプリケーションプログラムを書く際にはクラスをいくつも定義します。ポリモーフィズムを活用するため継承を使います。しかし、STLのコンテナにオブジェクトを入れようとして、はたと悩みます。世の中のSTLのサンプルは、コンテナに値をコピーで格納します。コピーだと、ポリモーフィズムが使えません。困った・・・ ポインタをコンテナの要素に そこで、苦肉の策としてコンテナにポインタを格納することにします。 #include

  • 頻度計数における unordered_map の調整(C++) - やた@はてな日記

    形態素の頻度をカウントするというシンプルなタスクで std::tr1::unordered_map の性能について実験してみました.std::string より const char * の方がメモリを節約できるというような軽い内容です. 実験概要 実験環境は以下のとおりです. 実験環境 CPU:Core 2 Duo U9600 1.60GHz コンパイラ:gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5) 入力として使用したのは,ウェブコーパスから抽出した形態素を改行区切りで保存したファイルです. 入力 サイズ:815,793,701 bytes 形態素数:133,940,786 異なり数:516,612 形態素の入力については,std::ios::sync_with_stdio(false) を呼び出した後で std::getline() を使うようにし

    頻度計数における unordered_map の調整(C++) - やた@はてな日記
  • Welcome to yk55.com 网站正在建设中!

    买域名就到“爱米人” 我们有几十万个精品域名:aimiren.com

    chezou
    chezou 2012/02/14
    typeidをするときにdemangleしてクラス名を取得する
  • でらうま倶楽部 : C++でJSONを読み書きするならpicojson

    2011年06月06日18:50 カテゴリプログラム C++でJSONを読み書きするならpicojson さいきんC++始めました。 まだ始めて2、3日なのですがCにクラスとか色々マクロで拡張を施した言語という印象です。 元々の出発点が「C with Classes」というCの拡張なのだからだと思います。 で、まず標準出入力やファイル出入力のやりかたとか触った後に試したのがJSONのパーサー。 ググって見たらpicojsonなるものを発見!これなんとヘッダファイルだけで実装されています。そういうの好き。 こんな感じで使います。 picojson::value json; cin >> json; picojson::object& o = json.get<picojson::object>(); int hoge = o["hoge"].get<double>(); bool fuga

  • How do I sort a vector of pairs based on the second element of the pair?

    If I have a vector of pairs: std::vector<std::pair<int, int> > vec; Is there and easy way to sort the list in increasing order based on the second element of the pair? I know I can write a little function object that will do the work, but is there a way to use existing parts of the STL and std::less to do the work directly? EDIT: I understand that I can write a separate function or class to pass t

    How do I sort a vector of pairs based on the second element of the pair?
    chezou
    chezou 2011/12/15
    pairのsecondをキーにしてvectorをsortする方法色々。テンプレート使って抽象化してあるのはよいな
  • re2のxxxNの使い方

    re2はGoogleが公開しているC++用の正規表現ライブラリです。速度も速い(らしい)し、ちゃんと日語一文字も"."でマッチしてくれるので、社内でも好んで使われています。 たくさん機能があるようなんですが、Web上であまり情報がなかったり、詳細はheaderファイル見てね!みたいなことが書かれていて、なかなかマスターするのが難しいライブラリです。特に、マッチ箇所(いわゆるgroup)が複数あるときにどうすればいいのかすぐにわかりません。私も以前ここではまって、色々調べてどうにか動いたことがありました。ちょうど@chezouさんが困っていたようなので、メモのつもりで晒してみましょう。 説明するより、コード読むがはやし、ということでサンプルを! #include <re2/re2.h> #include <string> #include <vector> #include <iostre

    chezou
    chezou 2011/11/26
    おお、早速コードが!ありがとうございます!
  • re2 - Project Hosting on Google Code

    This is the source code repository for RE2, a regular expression library. For documentation about how to install and use RE2, visit https://github.com/google/re2/. The short version is: make make test make install make testinstall Building RE2 requires Abseil (https://github.com/abseil/abseil-cpp) to be installed on your system. Building the testing for RE2 requires GoogleTest (https://github.com/

    re2 - Project Hosting on Google Code
    chezou
    chezou 2011/11/25
    google製のregexpコード。boostから乗り換えようかしら