C++

Makefile with CDT

Eclipse の CDT が生成する Makefile がひどいと思うのは自分だけだろうか。

new-initializer

C++

ref:http://shinh.skr.jp/m/?date=20090311#p01 ref:http://d.hatena.ne.jp/uskz/20080421/p1 む。違うのかー。 なんか、実際試して逆アセンブリして中身を見てみたい気がするが Windows マシンをだしてくるのがめんどい。

オブジェクトの宣言

C++

Foo* foo = new Foo; Foo* foo = new Foo(); これはどちらも同じ意味。 Foo foo; Foo foo(); これは違う意味。こゆのはなんなんだろなーと思う。

意外と知らない書き方 #2

C++

namespace s = std; 名前空間の別名宣言。

意外と知らない書き方

C++

class Foo; クラスの宣言。定義はまた別に。ヘッダファイルなんかで、Foo の構造とかメンバ関数とかの情報が特に必要ない場合に利用する。 class Foo foo; 変数宣言に class をつけることも出来る。まぁ、struct と同じ。 int foo(void), *bar(int); 複数の…

template specialization and different return type

C++

ふと、特殊化されたテンプレートごとに戻り値をかえたくなった。ようするにこういうこと。 template<> int foo<short>(); template<> long foo<int>(); ところが、これは一般化されたテンプレートを宣言できないのでうまくいかない。template parameter と戻り値が一緒な</int></short>…

rope

C++

そいや、Rope って使ったことないな。あと、メモリモデル云々というより文字列連結の計算量の問題とか。

extern "C"

C++

extern "C" { std::vector<std::string> foo(void); } だれだ、こんなコードを書いたやつは。</std::string>

評価順序

C++

昨日のネタだが、よくよく考えると、評価順序と結合順序がどうこうという話が混じっている気がしてきた。 あともっとシンプルなことをいうと、 ((a + b) + c) + dをどういう順番で評価するかなんて処理系依存で、そのへんの断りをいれないのはどうよ、と。 …

マニピュレータ

C++

浮動小数点数(のビットパターン)を二進出力というのはマニピュレータを自分で書かないと ダメなんじゃなかろうか。 いや、むしろマニピュレータだと無理だと思います。あれは単にフラグの設定を行ったりするだけなので。たとえば、std::setbase(16) は最終的…

引数の評価順序

C++

ref:http://www.kt.rim.or.jp/~kbk/zakkicho/08/zakkicho0806a.html#D20080602-2 ref:http://d.hatena.ne.jp/tanakaBox/20080601/1212323631 関数の引数を後ろから評価するとかいうものすごく実装依存なことをなんの断りもなくかくというのはとっても危険な…

C++ の仕様はそんなにややこしくないよ説

C++

ref:http://shinh.skr.jp/m/?date=20080322#p05 ref:http://www.kmonos.net/wlog/83.html#_1721080322 ふーむ。 コード生成はややこしくないよ、というのはその通りだと思うのですが。 メンバ関数テンプレート*1とか、テンプレートの(部分)特殊化とか結構や…

C++の入門書

C++

ref:http://d.hatena.ne.jp/higepon/20080319/1205938025 id:higepon さんの目的には合致してない気がするけど、私は Deitel 親子の 「C++プログラミング」で学習した。普通にプログラミングとかオブジェクト指向の入門書としては良書だと思う。まぁ、なにぶ…

そりゃ無理だ

C++

ref:http://d.hatena.ne.jp/higepon/20080320/1206023186 C++ 仕様がアレ過ぎて、今現在も各種コンパイラ間のポータビリティが怪しいという状況なので、まぁ、個人レベルの開発で C++ のフルセットなんてのは結構無茶な話だなぁ。Cygnus/RedHat がなければ、…

vector/list のメモリ効率

C++

ref:http://www.algo.ics.tut.ac.jp/~yusuke_abe/html/2008-03-09.html#2008-03-09-1 ref:http://d.hatena.ne.jp/Isoparametric/20080310/1205154971 ref:http://d.hatena.ne.jp/bleis-tift/20080311/1205201438 意外なところに食いつきが良くてびびった。 v…

Generics と template

ref:http://d.hatena.ne.jp/morchin/20080220#p1 Generics で Duck type は無理です。 基本的には kinaba さんが書かれている通りで。 Dのテンプレートは、仕組み的には C++ のそれと全く同じです。引数の違う実体は全部別のインスタンスとして、コンパイル…

暗黙の型変換

ref:http://cappuccino.jp/keisuken/logbook/20080217.html#p01 いつものことながら Scala すごいなー。 C++ でも型 A に 型 B を引数によるコンストラクタが定義されていると暗黙に B=>A の変換が発生したり、演算子のオーバーロードで暗黙の変換が発生した…

lvalue

C++

ref:ときどきの雑記帖 i戦士篇 2008年1月(下旬) ふむ。参照の導入だとか演算子オーバーロードとの関連もありそうな。 C++ の場合、演算子オーバーロードがあるので、 class int_array { public: int_array(size_t size) : data(new int[size]) { } ~int_arra…

dup2(2)

ref:http://d.hatena.ne.jp/naoya/20070731/1185893412 キモになるのは 複数のサービスをまとめて面倒を見るにあたって、それぞれのサービス用のリスニングソケットを select(2) で多重化する 接続があると fork して子を作り、その子を exec して本体のプロ…

例外の発生箇所を gdb で捕捉する

C++

gdb で catch throw を使えば例外を捕捉できるという話をコメントで教えていただいたので、試してみた。 #include <string> static void foo(void); int main() { foo(); return 0; } static void foo() { std::string s = "abc"; s.replace(-1, 0, "d"); } % g++ -g</string>…

例外とバックトレースを使ったデバッグ

あるプログラムを使っていると std::out_of_range で abort したので、デバッグしようとするものの、C++ は例外で abort しても Java のようにバックトレースを表示してくれたりしないので、どこが問題か分かり難くて困った。 #include <cstdlib> #include <cstdio> #include <execinfo.h></execinfo.h></cstdio></cstdlib>…

STLFilt

C++

コンパイルエラーが一行で何百文字あるんだよ・・・。 あるある。 そんなあなたに STLFilt。

C++ で Suffix Array

C++

ref:methaneの日記 - binder1stはとっても中途半端 ref:methaneの日記 - std::equal_range()の型縛り 真の STL 使いは std::string とか書かずに全部 iterator でなんとかする、気がする。いや、そんなことはないか。 自分なら、比較用の functor はこう書く…

制御構文・論理演算を一切使わずに FizzBuzz

C++ なら剰余演算どころか if も for も一切使わずに FizzBuzz が書けるとかそういうネタ。てか、まだ FizzBuzz ネタを引っ張るか。 ちなみに、プログラム中には剰余演算があるが、C++ の仕様上、これはコンパイルタイムに計算されるはずなので、実行時には…

switch と初期化

C++

ref:c⌒っ_д_)っ←のや - 敗北 まぁ、なんというか大雑把ですね、説明が。デストラクタがない、int や double でも同様だったりする罠。 とりあえず、問題は初期化を飛び越えること、ということを以前きむら(K)さんが書いていたので、ポインタだけ。(←手抜き) …

高速な log2 #2

C++

ということで、インラインアセンブリをフル活用するバージョン。移植性ってなんですか? Visual Studio 2005, gcc 3.4.4 on cygwin, gcc 4.1 on Linux(x86), gcc 3.4.6 on Linux(amd64) で動作確認済み。Borland C++ Compiler 5.5 にも対応しようと思ったけ…

高速な log2

C++

高速に floor(log2(n)) を計算するコード。無駄に template です。大量の計算のお供に。 #include <boost/concept_check.hpp> /** * returns floor of log i */ template<typename INT> inline int intlog2(INT i) { boost::function_requires< boost::UnsignedIntegerConcept<INT> >(); int n = 1; int d</int></typename></boost/concept_check.hpp>…

placement new

C++

ref:神様なんて信じない僕らのために - オレオレアロケータ いわゆる placement new ですね。 std::allocator と紛らわしいとかいう話は置いておくとしても、operator new/operator delete だけじゃなく、operator new[]/operator delete[] も定義したほうが…

ポインタと参照の違い

C++

ref:神様なんて信じない僕らのために - ポインタと参照 メンバ変数のメモリレイアウトは規格で決められていないはずなので、例としては微妙だなぁ。 それはそれとして、思いつく限り、ポインタと参照の違いを並べてみる。 参照には NULL pointer に相当する…

virtual

C++

互換性の問題もあるんだろうけど、とりあえず virtual だけだと fanctor(関数オブジェクト)のインライン展開ができなくなるなぁ。それはよろしくない。