vectorがPODのバッファとして使えるかどうか実験してみました.ただし,自分は精度の良い測定ができるフレームワークを持っていないので,大まかな結果だけ載せておきます.
(´-`).。oO(地道にstd::clock()使って統計的に値を推定したなんて恥ずかしくて言える訳ない・・・)
っていうか,どこかにそういうの落ちていませんか?
ちなみに測定したコードは以下の6つです.いくつかの理由により,フリーストアの確保と破棄の時間も含めて測定しています.
気になる方は自分で実験してみてください.
- new + memcpy(ベースライン)
{ char *trg = new char[sz]; memcpy(trg, sz, data); delete[] trg; }
{ vectorv; v.reserve(sz); for(std::size_t i = 0; i < sz; ++i){ v.push_back(data[i]); } }
- vector
::resize + memcpy
{ std::vectorv(sz); // resizeを一緒にやってしまう memcpy(&v[0], sz, data); }
{ std::vectorv(data, data + sz); }
以下の2つはアルゴリズムの実装を見ていてあることが気になったので,比較のためにやったものです.
{ std::vectorv(sz); std::copy(data, data + sz, v.begin()); }
- vector
::resize + ポインタによるstd::copy
{ std::vectorv(sz); std::copy(data, data + sz, &v[0]); }
以下では,ベースラインを1.0としてoverheadがどれだけあるかを数字で示します.(2.0ならベースラインの2倍のオーバーヘッドという意味)