2. 自己紹介 • 田中 英行 (@tanakh, id:tanakh) • (株)Preferred Infrastructure 勤務 • Haskell好き/C++嫌い • C++歴13年 – 主にWindowsでゲームを作ったりしていました – 最近は仕事でコンソールアプリ書いてます
C++AdventCalendarの記事です。 さて、 生配列使ってますか? tr1::array(boost::array) 使ってますか? 生配列使っていると答えた貴方、 →まず死ね。 はい、arrayが常識ですよね。 さて、とはいえ、 「テンプレートを使うと遅いしコードがでかいし」 「生配列が一番速いしコードが小さいし」 「なのでテンプレート禁止」 なんて話を聞くこともあるかと思いますが、 こういう事をいう人は大抵「テンプレートを書いたことがない」のに言ってます。 なぜか? こういう人が本当に心配しているのは「テンプレートが肥大化すること」じゃないのです。 「テンプレートが書けないし読めないのを認めたくないからです」 多くはCの老害だからですが、そういう人は放っておいてC++な人はきちんとテンプレートを使いましょう。 だって多くのテンプレートのコードは大きくもなければ非効率でもないか
これは本物なのかなあ…。Computer 誌(IEEE 発行)が C++ 言語の開発者 Bjarne Stroustrup 氏に行ったインタビューの記録だそうです。内容に非常に問題があるため実際には掲載されなかったのが、どこからかリークされたものだとか。 本物かどうかは自分で判断してください。私としては何とも言えません。Usenet のニュースグループ rec.games.roguelike.angband への投稿記事が原文です。(英語原文はこちら) インタビューア(以下「I」): あなたがソフトウェアデザインの世界を一変させてから何年にもなる。振り返ってみて、感想は。 Stroustrup(以下「S」): 実はあなたがここへ来る直前、当時のことを思い出していたんだ。おぼえているかな。誰もが C 言語を使っていたけど、問題はみんな結構うまくコーディングしていたことだった。大学も C
鉄則2: シグナルハンドラで行ってよい処理を知ろう sigaction関数で登録したシグナルハンドラで行ってよい処理は非常に限定されている 次の3つの処理だけが許されている 自動変数の操作 “volatile sig_atomic_t” 型の大域変数の操作 「非同期シグナルセーフ」関数の呼び出し これ以外の処理を記述しないこと! 説明: シグナル受信時に何らかの処理を行うためには、シグナルハンドラと呼ばれる関数を用意し、それをsigaction関数でシグナル名と紐付けておけばOKです。しかし、シグナルハンドラ内で行ってよい処理は、上記の通り非常に限定されています。これを把握しないまま奔放なコードを書くと次のような現象が起き得ます: 問題1: プログラムがデッドロックする危険がある タイミングに依存する、再現困難なバグの原因となる デッドロックの発生が典型例だが、それ以外にも関数の戻り値不正
分散KVS kumofs のコードは、全体で約2万行です*1。 そのうち、ネットワークI/Oやプロトコルに関するコードは約1万行*2で、全体の約半分を占めています。 ロジックは残りの半分*3だけで実装されています。 この実例から分かりますが、kumofsのような分散アプリケーションを開発するにはI/O周りの実装が大変で、とてつもなく大きな障壁になっています。*4 さらに今日では、性能を稼ぐためにマルチスレッド化が必須です。また、多数のクライアントを少ないリソースで効率よく相手にするには、非同期・イベント駆動型のアーキテクチャも必要になります。さらに、究極的な性能を達成すべく GC を利用しない C++ においては、実装のみならず設計も大変です。 これに加えてソケットAPIの難解な挙動に対処にしなければならないため、C言語やC++によるネットワークプログラミングは、vimの使いこなしなどと同
未踏プロジェクトの支援を受けて開発していた、C/C++のための開発援助ツールGCCSenseをリリースしました。配布物やドキュメントは次のURLから入手できます。 http://cx4a.org/software/gccsense/index.ja.html 開発援助ツールと銘打っていますが、現状利用できる機能はコード補完と自動構文チェック(Emacsのみ)だけです。将来的には関数ヘルプ機能や型表示機能を実装する予定です。 GCCSenseはコード補完などの機能を搭載した独自のGCCを利用しているため、インストールがかなり面倒です。ドキュメントによってある程度カバーしたつもりですが、環境によってまちまちなのでインストール時に問題が出てくるのは必至だと思います。その際は私に連絡してください。 また、独自GCCを利用している関係上、現状ではWindowsでの利用はできません。自由なソフトウェア
はじめに 前回は、Qtの歴史そして現在と展望について説明しました。今回は、Qtの入手方法について簡単に触れた後、Qt WebKitの説明の前に、Qtの中核機能の中から3回に分けて最も重要なシグナルとスロット、オブジェトモデル、レイアウトマネージメントについて、少し普通とは違った視点で説明します。 入手方法 Qtには、商用版、評価版、オープンソース版のライセンスがあり、オープンソース版の入手方法は2通りあります。 UNIX/Linuxディストリビューションのパッケージを利用する Ubuntu/Kubuntu 8.04などのディストリビューションにはパッケージが用意されています。合わせてQt4ベースのKDE 4もパッケージで入手できます。 Trolltechのサイトからダウンロードする サポートされるコンパイラ UNIX/LinuxではGCCやSunCCなどのコンパイラがサポートされます。Ph
参考: http://d.hatena.ne.jp/faith_and_brave/20100201/1264997004 「C++0xになると、C++03 でごちゃごちゃした部分がだいぶすっきり書けるようになる」 らしいですが、C++0xを待たなくてもBoostを使えばだいぶすっきり書けるので、 BoostでのC++入門はこんな感じだよー、という気持ちで以下略。 この記事はC言語をある程度理解していることが前提です。 1. Hello World C++/Boostでの出力はC++標準の IOStream ライブラリと Boost.Format を組み合わせて行います。 例として、C言語のprintfを用いた Hello World を、C++/Boostを使って書き直してみます。 #include <stdio.h> int main() { printf( "%s\n", "Hell
「C++ はあまりに『熟練者に優しく』なってしまった」(C++ has indeed become too "expert friendly") Stroustrup 氏の言は真実である。なぜなら熟練者は言語のイディオムに深く精通しているからである。プログラマが理解するイディオムの増加に従って、言語は彼あるいは彼女にとってよりフレンドリーになる。この open content book の目的はほどほどに C++ に精通しているプログラマに対して現代的な C++ のイディオムを提示し、C++ をよりずっとフレンドリーに感じるレベルにまで知識を引き上げる助けと成る事である。本書は熟練した C++ プログラマが C++ を使ってプログラミングや設計を行う際に用いる事の多い再利用可能なイディオムの網羅的なカタログと成るよう意図されている。これは、それらのテクニックや語彙をひとまとめにしようという
gmane.comp.lib.boost.devel - 【Foreach】 Proposal to simplify using Boost.Foreach with maps こんなことできたんだ! #include <iostream> #include <map> #include <boost/tuple/tuple.hpp> #include <boost/foreach.hpp> int main() { std::map<int, int> m; m[1] = 3; m[2] = 2; m[3] = 1; int key, value; BOOST_FOREACH(boost::tie(key, value), m) std::cout << key << ", " << value << std::endl; } ignore使えばvalueだけほしいとき便利かも。 #i
Source codeにおけるindentの流儀についての議論は果てがないように見受けられます。I.S.にとってもindentについては拘りがあり、defaultの設定では満足できないことが多いです。 Emacsではfileの編集中に自動的にindentを行ってくれますが、そのindent方法が自分の好みでなければ、その便利な機能も一転迷惑極まりない機能に成り果てます。 Emacsでは、設定file*1において、以下のようにstyleを選択することができますが、その用意されているstyleの全てが自分の好みでなければ、自分でindent設定を細かく記述するか、手動でひたすらindentしつづけるか、自動indentの苦痛に黙って耐えつづけるしかありません。 (add-hook 'c++-mode-hook '(lambda () (c-set-style "gnu") ; k&r、bsd、
Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at
コピーコンストラクタ(と代入演算子)はなかなか扱いの難しい代物ですが,今回は「デストラクタで何らかの終了処理を記述している場合」でのコピーコンストラクタの設計方針について検討します. 例えば,以下のようなファイルの入出力処理を扱うクラスを考えます. class file_wrapper { public: file_wrapper() : f_(NULL) {} explicit file_wrapper(const char* filename) : f_(NULL) { this->open(filename); } virtual ~file_wrapper() throw() { this->close(); } file_wrapper& open(const char* filename) { f_ = fopen(filename); if (f_ == NULL) thro
zip の解凍クラスが必要になったので作成.C/C++ で zip を扱う場合,zlib のサンプルコードの 1 つである minizip を使うのが一番楽そうなので,このライブラリを利用したラッパクラスを作成することを考えます. zip は,複数のファイル/ディレクトリをひとまとめにしてアーカイブ化できる機能があるので,この複数のファイルへの操作方法が問題となってきます.試行錯誤した結果,zip アーカイブ内の各要素(ファイル/ディレクトリ)を順に走査できるような iterator を用意して,通常はこの iterator を通して各ファイルにアクセスするような実装としました. サンプルプログラムは以下のようになります.unzip オブジェクトを生成した後は,begin() や find() メソッドを用いて zip アーカイブ内の処理を行いたいファイルへアクセスします.これらのメソッド
C++ フリーでぷろぐらみんぐ 逆引きリファレンス。 C++のやりたい事から引ける逆引きメモを書いています。 何かコメントなどいただけると嬉しいです! C++では、STLを使用すると特にイテレータが大活躍ですね(^^) 自分でイテレータを作成する必要にせまられることはないかと思います。 でも、独自のイテレータを作成するにはどうしたらよいかは興味深いと思います。 さて、ここでは、char*のイテレータを作成しようと思います。 あまり意味の無い試みです。 なぜなら、アルゴリズムの、copyやreverseなど様々な関数テンプレートはおそらくchar*の型をそのまま扱えるからです。 ま。遊びなので 【サンプル】 #include <cstdlib> #include <iostream> #include <iterator> #include <algorithm> #include <sst
多くの人が書いていそうですが、 C++テンプレートテクニックは、 Modern(Modern C++ Design)への架け橋だと感じました。 今まで、C++に関するテンプレートの本として、 STLを使いこなすための本や、Boostを使うための本などはあっても、 「テンプレートの技術を知り、より良いテンプレートを書くための本」というのは殆どなかったと思います。 そういった中で 「Modernを読めば殆どすべてのテンプレートを読み書きできるようになる」 なんていう意見も聴いたことがありますが、 そんな人は極々一部でModern単体としてみたとき、(あまりにも高度すぎて) 実践的というには無理がある内容だったと思います。 そのなかで、この本はテクニックの紹介により、 より一歩テンプレートの世界に踏み込めるようになっており、 テンプレートを書きたい、 と思わせる内容に仕上がっているとおもいました
テンポラリ・バッファとしての std::vector の利用 悩ましきテンポラリ・バッファ 一時的に必要となる領域、すなわちテンポラリ・バッファはプログラムのいたるところで用いられます。 void f() { char buffer[256]; ... } 上の例では256[char]のbufferをautomatic領域に確保しています。 場合によってはこのような固定サイズではなく、可変長のテンポラリ・バッファを必要とします。可変長のテンポラリ・バッファが必要なとき、通常opeartor newによってヒープ領域から確保するでしょう。 void f() { char* buffer = new char[N]; // Nは変数 ... delete[] buffer; } 当然のことながら、operator newによってヒープから確保した領域は、利用後速やかにoperator dele
Google が公開しているソフトウェアの解説シリーズ(→その1 , その2)の続きです。今回は google-glog を使ってスタックトレースを表示する方法についてご紹介します。 C++ でプログラムを書いているとよく遭遇するのがセグメンテーション違反というエラーです。不正なアドレスへのアクセスなどによりセグメンテーション違反が起きると、通常、 UNIX 系の OS では SIGSEGV というシグナルによってプログラムが終了するとともに、 core というファイルが作られます。 core ファイルにはデバッガから参照できるいろいろな情報が残っていますが、多くの場合に役に立つのは、スタックトレースという情報です。スタックトレースを見れば、プログラムがどこでクラッシュしたのか、どのような関数を経由してそこにたどり着いたのかがわかります。プログラムがクラッシュした箇所を特定できれば、単純な
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く