タグ

c++に関するdannのブックマーク (263)

  • C++: ストリームの出力先をファイルや標準出力に切り替える

    C++のストリームの出力先を任意にファイルや標準出力に切り替えたいときがたまにある。しかし、その度に標準出力ストリームやファイルストリームを定義し直して使うのは面倒だし、効率が悪い。 そんな時は、以下のコードで示す方法で切り替えると楽だ。2~3行で変更できる。さらに、ostreamのポインタでストリームを保持しておけば動的な切り替えも簡単だ。 以下、ソースコード。 #include <iostream> #include <fstream> using namespace std; int main() { // coutの出力バッファをofstreamのバッファに変更する方法. // 最後にcoutの出力バッファを元に戻すこと. streambuf* last = cout.rdbuf(); ofstream ofs("test01.txt", ios_base::out); cout.

    dann
    dann 2011/03/29
  • 開発メモ: アラインメント問題とDebianパッケージ化

    考察 考察ってほどでもないが、個人的に興味深いと思う点を挙げておこう。第一に、少なくともi386だと、推奨アラインメントと構造体の最小オフセットが異なるということだ。オブジェクトのサイズと推奨アラインメントが同じになるのは直感的に理解できる(そうでないと配列がうまく扱えないから)が、構造体の中にメンバを配置する際には、推奨アラインメントよりも低いアラインメントでオブジェクトを詰めて配置することがあるということだ。つまり、i386では、8バイト幅であるlong longのオブジェクトを4の倍数のアドレスに配置しても正常に評価ができるということだ。理由はよくわからんが、メモリ使用量の節約のためとか後方互換性のためとかそんなところなのだろう。 第二に興味深いのは、i386だと、long doubleのサイズが12バイトで推奨アラインメントが4だということだ。doubleの推奨アラインメントは8な

  • Asynchronous Fork/Join using Asio

    As most Asio users will no doubt be aware, multiple threads can call io_service::run() to set up a pool of threads from which the completion handlers will be executed. This can be used in conjunction with io_service::post() to execute arbitrary tasks in the thread pool. In some rare spare moments I have used this facility to dabble in parallel algorithms (mainly to do with sorting large data sets)

    Asynchronous Fork/Join using Asio
    dann
    dann 2011/03/29
  • gcc-4.6.0 コンパイル通ったよ! - 野良C++erの雑記帳

    以下、テストコード: #include <vector> #include <memory> // for std::unique_ptr // implicit move struct X { X() = default; X( std::vector<int> src ) : p( new auto( std::move(src) ) ) {} // X( X&& ) = default; // noexcept-specification int* begin() noexcept(true) { return p ? p->data() : nullptr; // nullptr } int* end() noexcept(true) { return p ? ( p->data() + p->size() ) : nullptr; } private: std::unique_p

    gcc-4.6.0 コンパイル通ったよ! - 野良C++erの雑記帳
    dann
    dann 2011/03/29
  • C++プログラマであるかを見分ける10の質問 - Cube Lilac

    「優れたPerlプログラマを見分ける27の質問」の日語訳 - Islands in the byte stream, Javaプログラマであるかを見分ける10の質問 - やさしいデスマーチ を見ながら C++ だとこれくらいかなぁと取りあえず作ってみました.前半は単純な機能の説明,後半は実際にどのように使って(使い分けて)いくかについての質問になっています.選択基準としては,特に後半部分は,自分が観測できている C++ 界隈で論争になったトピックを中心に取り上げています. iterator の役割について説明せよ. *_cast およびCスタイルのキャストそれぞれについて概要を説明せよ. overload と override と hiding の違いについて説明せよ. const の機能について概要を説明せよ. 多重継承について概要を説明せよ. ポインタの使用方法について,メモリーリー

    C++プログラマであるかを見分ける10の質問 - Cube Lilac
    dann
    dann 2011/03/09
  • C++コミュニティーの中心でC++をDISる

    Boost.勉強会4にて発表した内容です。http://atnd.org/events/11551Read less

    C++コミュニティーの中心でC++をDISる
    dann
    dann 2011/02/27
  • メモリの二重解放回避テク - akihiko’s tech note

    メモリの二重解放とは, new などで確保したメモリ領域(ヒープ領域)を2回 delete などで解放することを言う. new と delete をきちんと対応させて書いていないときに起こる問題だ.特にクラスのメンバに動的確保したメモリへのポインタを含む場合にやってしまいがちである.ここでは二重解放によって発生する問題を解説する. 結論から言うと,メモリを解放した後 (delete p1;),ほかの用途でメモリを確保し (p2=new T;),たまたまそれが解放したメモリと同じアドレスに割り当てられてしまった場合 (p1==p2),最初のメモリを二重解放すると (delete p1;),新しく確保したメモリ (p2) が解放されてしまう.この結果,新しく確保したメモリにアクセスすると値が書き換えられていたり,セグメンテーションフォルトが発生する場合がある.プログラマはまず,新しく確保したメ

    メモリの二重解放回避テク - akihiko’s tech note
    dann
    dann 2011/02/08
  • Cのコールバック関数をC++のメンバ関数にバインディングする方法 - kazuhoのメモ置き場

    たとえば libevent のような C 言語でかかれたイベント駆動型のライブラリを C++ から使っていると、C++ のメンバ関数をコールバックとしてセットできたらうれしいことが多いですよね。以下のようにすればできます。 たとえば、コールバック関数をセットする関数の型が、 void set_foo_callback(void (*)(void* cb_arg), void* cb_arg); なら、以下のようにクラスとメンバ関数を引数にとるテンプレート関数を定義し、 template <typename T, void (T::*FUNC)()> void to_foo_callback(void* cb_arg) { T* obj = reinterpret_cast<T*>(cb_arg); (obj->*FUNC)(); }以下のように受け渡せばいい。 class K { publ

    Cのコールバック関数をC++のメンバ関数にバインディングする方法 - kazuhoのメモ置き場
    dann
    dann 2011/01/26
  • DateTimeライブラリを書きました - Faith and Brave - C++で遊ぼう

    Boost.DateTimeが使いにくかったので、日時計算を目的とした簡単なDateTimeライブラリを書きました。 SHAND_DATE_TIME_CUSTOM_NOW_TIMEをdefineすることで、現在日時を返す関数を書き換えることができるようになるので、Testableです。 フォーマット指定は、strftimeを参考に、よく使うものだけを採用しました。 shand/date_time.hpp #ifndef SHAND_DATE_TIME_INCLUDE #define SHAND_DATE_TIME_INCLUDE #include <cstddef> #include <ctime> #include <map> #include <boost/xpressive/xpressive_static.hpp> #include <boost/xpressive/regex_a

    DateTimeライブラリを書きました - Faith and Brave - C++で遊ぼう
    dann
    dann 2011/01/23
  • std::string の正体(gcc-4.4.3)と細かい話 - やた@はてな日記

    # 環境依存な内容な上,無駄に細かい話なので,「そういうこともあるかもねー」くらいに流しちゃってください. (追記 2011-01-11)新しい規格では std::string の Copy on Write(CoW: 書き込み時に複製)が実質禁止になるとのことです.後,gcc 4.5 の時点で CoW はやめてしまうみたいですし,「そんな時代もあった」くらいに軽く流しちゃってください.id:gintenlabo さん,コメントありがとうございます. (追記の続き)個人的には,std::string の CoW 動作は挙動が分かりにくくなるので止める方に賛成です.でも,std::vector なんかを拡張するときはどうするのかな…?コピーしてしまうのか,swap() を使うようにするのか…. (さらに追記 2011-01-11)おおっと,ムーブコンストラクタにムーブ代入演算子なんてものが…

    std::string の正体(gcc-4.4.3)と細かい話 - やた@はてな日記
  • libkyototycoon をつかって 5分で C++ で RPC サーバーを書く方法 - tokuhirom's blog

    ちょっとした RPC サーバーを C/C++ でかきたいな、なんてケースはままあるわけですが、そんなときに便利なライブラリがあったので紹介します。 KyotoTycoon をつかうと、TSVRPC over HTTP な RPC サーバーが超簡単にかけて便利だった。libkyototycoon は GPL だけど、それが問題にならない場合なら、とてもいいとおもう。商用ライセンスかえるならそれもいいとおもう。 RPC サーバーとしては他にもいくつか実装があるんだけど、HTTP の上で実装されているから、デバッグが容易だったりとか、直接 telnet ではなしたりとか tcpdump できたりして、いろいろ便利なので、よいとおもう。 SConstruct でビルドルールをかいてから e = Environment() e.Program('ktechoserver', ['ktechoserv

  • 久々にC++使ったら進化してて素敵になってた件 – taichino.com

    最近、数年ぶりにC++を触っているのですが、いつの間にかかなり使いやすくなっていました。まだ全容は把握できてないのですが、とりあえず印象に残った以下の項目について書いてみたいと思います。 BOOST_FOREACHとautoですっきりループ tupleで無くなる無駄な構造体 #pragma onceで楽々インクルードガード std::functionとlamda関数でコンパクトなコード typeidでリフレクション 主にC++0x周りの話だと思っていますが、勘違いしている可能性も高いです。 前置きですが、エントリ内のコードはすべてgccの4.5.0で動作確認を行っています。(mac portのgcc45パッケージをインストールしました)。またビルド時にはc++0xの使用を明示する必要があります。 $ g++-mp-4.5 -std=c++0x main.cpp 1. BOOST_FORE

    dann
    dann 2011/01/23
  • C++0x 標準ライブラリ完全解説 〜 No.02 std::move, - 野良C++erの雑記帳

    該当規格: 20.3.3 forward/move helpers [forward], N3225 http://sites.google.com/site/cpprefjp/reference/utility/move 少し間隔があいてしまいましたが、 C++0x 標準ライブラリ完全解説の二回目です。 前回の記事では、 C++98/03 の時点から変わらないライブラリを紹介しました。 今回からは、 のうち、 C++0x で追加された部分を取り扱っていきます。 つまり、ここからが C++0x でパワーアップした の領発揮。 その最初の回である今回は、 std::move という簡単な、しかし強力なヘルパ関数を紹介します。 これは、あるオブジェクトに対して、 「もうこのオブジェクトは使わないから、好きに扱っていいよ」 と明示する為の関数です。 定義 namespace std { tem

    C++0x 標準ライブラリ完全解説 〜 No.02 std::move, - 野良C++erの雑記帳
  • Google Sites: Sign-in

    Not your computer? Use a private browsing window to sign in. Learn more about using Guest mode

    dann
    dann 2011/01/23
  • すごいぞつよいぞプリコンパイル済みヘッダー - 私志信

    いままでずーと使用方法が分からなかった プリコンパイル済みヘッダー(Visual C++ 2008 Express Edition) の使い方が分かりました。 ソフトハウスに勤めているような方なら 基礎的な知識として一発で習得できるのだとおもいますが。 一介の野良プログラマにとってはかなりきつきつだったんだぜ! 結論からいうと、 一つのプロジェクトで必要とされる全てのヘッダファイル(.h)を たった一つのソースファイル(.cpp)に書くだけで済むようになる というものです(あとはコンパイルも早くなります というかこっちが主)。 例えばこんな例があったとして //testA.cpp #include "testA.h" #include <windows.h> #include <vector> #include <string> #include <sstream> #includ

  • C++のリファレンスサイトを作りました - Faith and Brave - C++で遊ぼう

    cpprefjp - C++語リファレンス まだサイトを用意しただけで、中身はまだまだです。 C++ Referenceが便利だったので、それの日語版 + C++0x対応したサイトがほしい、というのが動機です。 boostjp Google Groupのメンバであれば編集できるようにしてありますので、サイトの充実のためにみなさんご協力お願いします。 cpprefjpのためのGoogle Groupも用意しようかと考えましたが、boostjpとメンバが大幅にかぶりそうなので、boostjp一に絞ります。 cpprefjpでのご相談は、boostjpの方に投稿していただければと思います。

    C++のリファレンスサイトを作りました - Faith and Brave - C++で遊ぼう
    dann
    dann 2011/01/18
  • 使いもしないのにC++のtemplateを毛嫌いする全ての人に - 神様なんて信じない僕らのために

    C++AdventCalendarの記事です。 さて、 生配列使ってますか? tr1::array(boost::array) 使ってますか? 生配列使っていると答えた貴方、 →まず死ね。 はい、arrayが常識ですよね。 さて、とはいえ、 「テンプレートを使うと遅いしコードがでかいし」 「生配列が一番速いしコードが小さいし」 「なのでテンプレート禁止」 なんて話を聞くこともあるかと思いますが、 こういう事をいう人は大抵「テンプレートを書いたことがない」のに言ってます。 なぜか? こういう人が当に心配しているのは「テンプレートが肥大化すること」じゃないのです。 「テンプレートが書けないし読めないのを認めたくないからです」 多くはCの老害だからですが、そういう人は放っておいてC++な人はきちんとテンプレートを使いましょう。 だって多くのテンプレートのコードは大きくもなければ非効率でもないか

    使いもしないのにC++のtemplateを毛嫌いする全ての人に - 神様なんて信じない僕らのために
  • C++0x 標準ライブラリ完全解説 まとめ - 野良C++erの雑記帳

    No.00 Introduction (2011-01-07 更新) No.01 namespace rel_ops, utility (2011-01-07 更新) No.02 std::move, utiliy (2011-01-16 更新) No.03 std::move_if_noexcept, utiliy (2011-01-17 更新) No.04 std::swap, utiliy (次回予定)

    C++0x 標準ライブラリ完全解説 まとめ - 野良C++erの雑記帳
    dann
    dann 2011/01/09
  • それでも Boost.Optional を使う、大きく分けて2つくらいの理由 - 野良C++erの雑記帳

    Boost.Optional Must Go - 野良C++erの雑記帳 Boost.Optional Must Go (2) - 野良C++erの雑記帳 最近、何回かに分けて、 Boost.Optional について、(細かい)不満を日記に書いてきました。 これは別に Boost.Optional が嫌いだから不満を書いた訳ではなく、むしろ その逆、 Boost.Optional が便利な分、逆に不満点が目立つので書いていたわけですが、 よく考えたら、 Boost.Optional の便利さを、纏まった記事で書いていないなー、 と、そう思い至ったので、この辺で Boost.Optional を徹底的に推奨する記事でも書いてみようかな、 というわけで、さんざん既出なネタばかりですが、折角なので書いてみることにしましたよ。 冒頭に挙げた以外で参考になるような記事は、この辺でしょうか: C++

    それでも Boost.Optional を使う、大きく分けて2つくらいの理由 - 野良C++erの雑記帳
  • 話題のwat-arrayを使ってBurrows-Wheeler変換(BWT)してみた - EchizenBlog-Zwei

    先日PFIの岡野原氏によってwat-arrayというライブラリが公開された。 wat-array : wavelet木を利用した高速配列処理ライブラリ : Preferred Research Blog このライブラリは内部でウェーブレット木(wavelet tree)という簡潔データ構造(succinct data structure)を使っている。このため文字列に対するrank()やselect()などの操作が効率的にできるようになっている。 ・・・といっても馴染みのない人にとっては何が嬉しいのかピンと来ないかもしれない。そこでBurrows-Wheeler変換(BWT, Burrows-Wheeler Transform)を例にとってwat-arrayの使いみちを説明してみる。 Burrows-Wheeler変換というのはテキストを同じ文字が並びやすいように変換したもので、通常ランレ

    話題のwat-arrayを使ってBurrows-Wheeler変換(BWT)してみた - EchizenBlog-Zwei
    dann
    dann 2011/01/04