Tue, 26 Jun 2012
std::mapに要素を加える時の話
Tweet
例えばstd::map<int, a>
に要素を加える時、
std::map<int, a> hoge; hoge.insert(std::pair<int, a>(0, a()));
とやると、クラスa
のコンストラクタは何回走るか?思いつくところで
pair
のコンストラクタの引数のコンストラクタpair
のメンバ変数のコピーコンストラクタmap
のメンバ変数のコピーコンストラクタ
の3回あるが(他にあったら教えてください)、実際にやってみると4回とか5回実行されたりする。じゃあ
hoge[0]
ならどうかというと、clang++ -stdlib=libstdc++
でコンパイルすると3回走るんだけど、clang++ -stdlib=libc++
でコンパイルすると1回だけしか走らない!libc++賢いね!!というお話でした。
Thu, 21 Jul 2011
intのかけ算には気をつけよう
Tweet
レアケースかもしれないし、当たり前の常識かもしれないが、ちょっとハマったので書き留めておく。
C/C++でint
を使うとたいていは32ビットになるだろう。符号ビットがあるので実質31ビットで、log102が0.3ぐらいだから、十進では31×0.3=10桁くらいが最大値である。したがって103=1000ぐらいのint
を4つかけ算するとオーバーフローしてしまう。(しかも全くエラーが出ない。)ちょっと大きめのint
をちょっとたくさんかけるときはちゃんと大きい整数型にキャストしよう。(Googleはstdint.h
で定義されているサイズが明示された整数型の使用を勧めている。)