2009年2月11日

C++ の string と vector の reserve() の挙動

C++ の string と vector には前もって容量を確保するための reserve() というメンバ関数があります。何気なく使っていた関数ですが最近になって興味深い挙動に気づきました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2007年9月 8日

Unicode の文字列をソースコードに埋め込む方法

Unicode の文字列をソースコードに埋め込む場合、直接 UTF-8 などで文字列を書く方法と、\uXXXX などのようにエスケープして表記する方法があります。後者の方法についてまとめてみました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2007年7月15日

C++の設計と進化

しばらく前からのろのろ読んでいた『C++の設計と進化』を読み終えました。C++ の設計者、Bjarne Stroustrup 氏による著作です。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2007年7月 6日

C++と Pthreads でミニマルなHTTPサーバを書く

UNIXネットワークプログラミング』を読んでいると、自分でも何かネットワーク系の小さなプログラムを書いてみたくなりました。そこで、ミニマルなHTTPサーバを C++と Pthreads で書いてみました。

続きを読む...

投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2007年2月28日

浮動小数点演算ではまった話

浮動小数点演算のありがちな問題ではまりました。 いろいろ調べているうちに x86 特有のちょっとおもしろい 現象に遭遇したので紹介したいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2007年1月 6日

RAII と setjmp/longjmp

C++ には RAII (Resource Acquisition Is Initialization) というイディオムがあります。これはリソースの開放を確実に行うためのテクニックとして C++ のプログラムで広く用いられています。しかし、RAII も setjmp/longjmp という落とし穴があります。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年10月22日

文字列操作の比較表: Ruby, Python, JavaScript, Perl, C++

Ruby, Python, JavaScript, Perl, C++ の文字列操作の比較表を作りました。配列操作の比較表の続編です。間違いなどがあったらご指摘いただけると助かります。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年6月18日

プログラミング言語C++第3版

一年ほど前から読み始めて、気が向いたときに10~30ページずつ読むという亀の歩みで進めてきた『プログラミング言語C++第3版』をようやく読み終えました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年4月 3日

Doug Lea の malloc (dlmalloc)

小さなオブジェクトを大量に new しまくるプログラムを C++ で書いたところ、処理時間の多くが malloc() に費やされていることがわかりました。このような場合、自前でメモリ管理を行って最適化するという方法がありますが、なかなか大変です。

そこで、安易に高速な malloc に置き換えてみようということで、 Doug Lea の malloc (通称 dlmalloc) の最新版を試してみました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年2月22日

ライブラリの外に公開するシンボルを制限する

C言語にはファイル内 (コンパイル単位) からしかアクセスできない static 関数と、別のファイルからもアクセスできる非static 関数があります。しかし、ライブラリを作成する上では、この2つのスコープだけでは不十分なときがあります。

本記事では GNUの開発環境において、ライブラリの外に公開するシンボルを制限する方法を紹介します。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2006年1月 8日

C++ のシンボルをデマングルする

C++ コンパイラはシンボルが一意の名前を持つように名前マングル (name mangling) と呼ばれる処理を行います。本記事では GNU の開発環境で C++ のシンボルをデマングル (demangle) する方法を紹介します。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年12月19日

配列へのポインタと配列へのリファレンス

C/C++ のあまり使われない機能に、配列へのポインタと配列へのリファレンスがあります。ここでは、それらがどのようなものかまとめたいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年12月17日

main() の前に関数を呼ぶ

C/C++ のプログラムで、main() の前に関数を暗黙的に呼びたいときがあります。ここでは GCC の拡張を使った方法と、C++ のコンストラクタを使った方法を紹介したいと思います。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年12月15日

STL のバインダとリファレンスへのリファレンス問題

STL に含まれる bind1st と bind2nd は for_each や find などの関数と組み合わせて使うと便利です。しかしながら、リファレンス (参照) を引数に取る関数の引数をバインドすることはできないので注意が必要です。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年11月24日

Boostの正規表現クラスを使う

Boost の正規表現クラスを使ってみよう思い、ディレクトリ以下のファイルに対して再帰的に grep を行うコードを書いてみました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年11月 9日

STL の string のリファレンスカウント

Effective STLによると、多くの STL の実装では string クラスの内部において、文字列のコピーを減らすために、リファレンスカウントが行われているそうです。そこで、手元の環境の string クラスでリファレンスカウントが実際に行われているか調べてみました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年10月12日

リンクと同名シンボル: weak シンボル編

先日の記事では静的リンクの際に同名シンボルの衝突は検出されると書きました。しかし、 weak シンボルが存在すると話は変わります。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年10月10日

リンクと同名のシンボル: C++の場合

前回の記事で紹介した動的リンクの動作は、 C++ では予期せぬメンバ関数が呼ばれるという問題を引き起こします。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

リンクと同名のシンボル

C や C++ のプログラムで同じ名前のグローバルなシンボルが 2つ以上存在するとどうなるでしょうか。 Debian GNU/Linux sarge + GCC 3.3.5 での動作を見てみます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年10月 2日

C++ のテンプレートでダックタイピング

Ruby や Python などの動的な言語では、ダックタイピング (duck typing) というテクニックが多用されています。

ダックタイピングは、同じインタフェースさえ備えていれば型は何でも構わない、という考え方に基づく多態 (polymorphism) の手法です。アヒルのように見えて、アヒルのように鳴くなら、アヒルに違いない、というわけです。

そして、現在最も注目を浴びている言語である C++ でもテンプレートを用いるとダックタイピングを行えます。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年10月 1日

C の qsort と STL の sort の速度比較

一般に C の qsort より STL の sort の方が高速と言われています。 qsort が要素の比較のたびに関数を呼び出す必要があるのに対し、 STL の sort は比較関数をインライン化できるのが主な理由です。

…ということを、知人に話したところ、実際に比べたことあるのか、と突っ込みを受けたので、実験してみました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年9月 8日

C++ の関数ポインタ

関数をオーバーロードしたり、テンプレート化した場合に関数ポインタが使えるかどうか気になったので試してみました。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年9月 6日

C++ のキャストと一時オブジェクト

C++ を学んでいます。Ruby の学びやすさとコード書きやすさを高速道路とすれば、C++ は落とし穴だらけのあぜ道という感じがします。今日、Effective STL (の第22項) を読んでいてなるほどと思ったのはキャストするとコピーが作成されるときがある、ということです。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年8月27日

配列操作の比較表: Ruby, Python, JavaScript, Perl, C++

プログラムを書いていると、他のプログラミング言語の記憶とごっちゃになって、「配列の後ろに要素を追加するのは push だっけ、 append だっけ」などと混乱することがあります。特に Ruby, Python, JavaScript はコードの書き方が似ているので、この問題が起きがちです。

そこで、備忘録として、 Ruby, Python, JavaScript, Perl, C++ の配列操作の比較表を作りました。一番慣れている Ruby を基準にしています。間違いなどがあったらご指摘いただけると助かります。他の言語のもあるといいなあ。

続きを読む...
投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク

2005年6月 8日

(((foo))) in C++

Scheme の

gosh> (define (foo) foo)
foo
gosh> (((foo)))   ; いくらでも括弧を増やせる

みたいなことは C じゃできないよね、と知人に訊いたところ、C++ ならできるよ、と教えてもらった。

class Foo {
public:
    Foo& operator() () { return *this; }
};
int main(int argc, char *argv[])
{
    Foo foo;
    foo()()(); // いくらでも括弧を増やせる
    return 0;
}

boostコマンドラインオプション解析ライブラリでは、同様の方法を使ってオプションの定義を書くようだ (参考)。

投稿者 satoru : 固定リンク | このエントリーを含むはてなブックマーク