C++ の string と vector には前もって容量を確保するための reserve() というメンバ関数があります。何気なく使っていた関数ですが最近になって興味深い挙動に気づきました。
Unicode の文字列をソースコードに埋め込む場合、直接 UTF-8 などで文字列を書く方法と、\uXXXX などのようにエスケープして表記する方法があります。後者の方法についてまとめてみました。
しばらく前からのろのろ読んでいた『C++の設計と進化』を読み終えました。C++ の設計者、Bjarne Stroustrup 氏による著作です。
『UNIXネットワークプログラミング』を読んでいると、自分でも何かネットワーク系の小さなプログラムを書いてみたくなりました。そこで、ミニマルなHTTPサーバを C++と Pthreads で書いてみました。
浮動小数点演算のありがちな問題ではまりました。
いろいろ調べているうちに x86 特有のちょっとおもしろい
現象に遭遇したので紹介したいと思います。
C++ には RAII (Resource Acquisition Is Initialization) というイディオムがあります。これはリソースの開放を確実に行うためのテクニックとして C++ のプログラムで広く用いられています。しかし、RAII も setjmp/longjmp という落とし穴があります。
Ruby, Python, JavaScript, Perl, C++ の文字列操作の比較表を作りました。配列操作の比較表の続編です。間違いなどがあったらご指摘いただけると助かります。
続きを読む...一年ほど前から読み始めて、気が向いたときに10~30ページずつ読むという亀の歩みで進めてきた『プログラミング言語C++第3版』をようやく読み終えました。
続きを読む...小さなオブジェクトを大量に new しまくるプログラムを C++ で書いたところ、処理時間の多くが malloc() に費やされていることがわかりました。このような場合、自前でメモリ管理を行って最適化するという方法がありますが、なかなか大変です。
そこで、安易に高速な malloc に置き換えてみようということで、 Doug Lea の malloc (通称 dlmalloc) の最新版を試してみました。
続きを読む...C言語にはファイル内 (コンパイル単位) からしかアクセスできない static 関数と、別のファイルからもアクセスできる非static 関数があります。しかし、ライブラリを作成する上では、この2つのスコープだけでは不十分なときがあります。
本記事では GNUの開発環境において、ライブラリの外に公開するシンボルを制限する方法を紹介します。
続きを読む...C++ コンパイラはシンボルが一意の名前を持つように名前マングル (name mangling) と呼ばれる処理を行います。本記事では GNU の開発環境で C++ のシンボルをデマングル (demangle) する方法を紹介します。
続きを読む...C/C++ のあまり使われない機能に、配列へのポインタと配列へのリファレンスがあります。ここでは、それらがどのようなものかまとめたいと思います。
続きを読む...C/C++ のプログラムで、main() の前に関数を暗黙的に呼びたいときがあります。ここでは GCC の拡張を使った方法と、C++ のコンストラクタを使った方法を紹介したいと思います。
続きを読む...STL に含まれる bind1st と bind2nd は for_each や find などの関数と組み合わせて使うと便利です。しかしながら、リファレンス (参照) を引数に取る関数の引数をバインドすることはできないので注意が必要です。
続きを読む...Boost の正規表現クラスを使ってみよう思い、ディレクトリ以下のファイルに対して再帰的に grep を行うコードを書いてみました。
続きを読む...Effective STLによると、多くの STL の実装では string クラスの内部において、文字列のコピーを減らすために、リファレンスカウントが行われているそうです。そこで、手元の環境の string クラスでリファレンスカウントが実際に行われているか調べてみました。
続きを読む...先日の記事では静的リンクの際に同名シンボルの衝突は検出されると書きました。しかし、 weak シンボルが存在すると話は変わります。
続きを読む...前回の記事で紹介した動的リンクの動作は、 C++ では予期せぬメンバ関数が呼ばれるという問題を引き起こします。
続きを読む...C や C++ のプログラムで同じ名前のグローバルなシンボルが 2つ以上存在するとどうなるでしょうか。 Debian GNU/Linux sarge + GCC 3.3.5 での動作を見てみます。
続きを読む...Ruby や Python などの動的な言語では、ダックタイピング (duck typing) というテクニックが多用されています。
ダックタイピングは、同じインタフェースさえ備えていれば型は何でも構わない、という考え方に基づく多態 (polymorphism) の手法です。アヒルのように見えて、アヒルのように鳴くなら、アヒルに違いない、というわけです。
そして、現在最も注目を浴びている言語である C++ でもテンプレートを用いるとダックタイピングを行えます。
続きを読む...一般に C の qsort より STL の sort の方が高速と言われています。 qsort が要素の比較のたびに関数を呼び出す必要があるのに対し、 STL の sort は比較関数をインライン化できるのが主な理由です。
…ということを、知人に話したところ、実際に比べたことあるのか、と突っ込みを受けたので、実験してみました。
続きを読む...C++ を学んでいます。Ruby の学びやすさとコード書きやすさを高速道路とすれば、C++ は落とし穴だらけのあぜ道という感じがします。今日、Effective STL (の第22項) を読んでいてなるほどと思ったのはキャストするとコピーが作成されるときがある、ということです。
続きを読む...プログラムを書いていると、他のプログラミング言語の記憶とごっちゃになって、「配列の後ろに要素を追加するのは push だっけ、 append だっけ」などと混乱することがあります。特に Ruby, Python, JavaScript はコードの書き方が似ているので、この問題が起きがちです。
そこで、備忘録として、 Ruby, Python, JavaScript, Perl, C++ の配列操作の比較表を作りました。一番慣れている Ruby を基準にしています。間違いなどがあったらご指摘いただけると助かります。他の言語のもあるといいなあ。
続きを読む...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 のコマンドラインオプション解析ライブラリでは、同様の方法を使ってオプションの定義を書くようだ (参考)。