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