[C++] std::vector の実装
以下のソースをコンパイル,実行してみると,コピーコンストラクタが 4 回呼び出されているのを確認できました.
#include <iostream>
#include <vector>
class A
{
public:
A() { std::cerr << "A default ctor" << std::endl; }
A(const A& s) { std::cerr << "A copy ctor" << std::endl; value_ = s.value_; }
int value_;
};
int main()
{
std::vector<A> a1;
std::vector<A> a2;
std::cerr << "a1.resize(4)..." << std::endl;
a1.resize(4);
std::cerr << "a2.reserve(4)..." << std::endl;
a2.reserve(4);
return 0;
}
% g++ -O0 test.cc % ./a.out a1.resize(4)... A default ctor A copy ctor A copy ctor A copy ctor A copy ctor a2.reserve(4)... %
memcpy() 等を使ってメモリイメージを丸ごとコピーしているわけではないことがわかりましたが... コピーコンストラクタが 3 回ではなく 4 回呼ばれています.vector の最初の要素は 2 回のコンストラクタ呼び出しによって初期化されているのでしょうか.
ちなみにこの挙動は,無償版の icc 6.0.031 を用いても確認することができました.コンストラクタでは初期化以外の処理をしないほうが良さそうです.
トラックバック
トラックバック URI: https://www.pakunet.jp/hoge/trackback/2006020601
トラックバックはありません.