月別アーカイブ: 2013年3月

std::list の存在意義

事前の領域確保とかをせず単純に push_back を繰り返すのを
std::vector と std::list で比較してみた。
中身はint。回数は10万回。実行環境はiPhone5。んで、

std::vector が 0.015239秒。
std::list が 0.081944秒。

std::listが5倍以上遅い
連続領域を確保する必要があるstd::vectorの方が
逐次追加に弱いと勝手に思い込んでたのであれーってカンジ。

というワケで、途中に要素を追加するだの途中の要素を削除するだの
連結リスト特有の操作をするんでなければ
std::vectorを使えば良し、ってことですな。

あとはstd::vectorは領域確保が頻繁に起こらないように多めにスペース確保するので
メモリを余分に喰いがちなので、その辺のトレードオフだなあ。
一時的なバッファとして使うならstd::vector一択か。

っていうか。
実際のところ多くても1万扱うかどうかといったところで、
10万件追加で0.015秒とか0.08秒とかどっちでもいいよ、
っていう話しもある。
うん。

クラスの中にそのクラスのconstexprな定数を入れられない??

例えばカラーのクラス Color を作り、白や黒を表すそのクラスのコンパイル時定数を Color::white や Color::black と書けるようにしたい。
と思って下のように書いてみたのだが。。。。

クラスの中でそのクラスの定数を書こうとすると怒られる。。LLVM4.2。
クラスの外ならエラーは出ない。。。

うーーーん。。 微妙

#define で数値を定義する代わりに constexpr を使う

これまでのC++だと、なるべくマクロを撲滅したいと思って #define の代わりに const を使おうにも微妙に使い辛かった。

これをconstで置き換えて

などとヘッダに書いてしまうと、このヘッダを読んだソースの全てでk2PIが定義されてしまい、リンク時に重複エラーになってしまう。このため

とヘッダは宣言だけにして、定義はどっかソースファイルに書く必要があった。これが微妙に面倒臭くてつい横着して#defineで定数定義しちゃってた。

それがC++11ではconstexprで万事解決ですわよ奥さん。

constexprでコンパイル時定数として指定するので #defineの時のようにヘッダにそのまま書いてOK。

constexprはユーザ定義のクラスもコンパイル時定数にできたりといろいろやれるらしいけど、それよりなによりこの定数値をヘッダに書けるというのがありがたい。