何らかの理由で、my :: Vectorのオブジェクトを返したいと思います(これは基本的に、実際のストレージにSTLベクトルを内部的に使用し、いくつかの追加関数を提供するラッパークラスです)。関数が毎回ローカルでベクトルを作成するので、値ごとにベクトルを返します。
my::Vector<int> calcOnCPU()
{
my::Vector<int> v....
return v;
}
これで、(ライブラリの設計を考慮して)関数呼び出しを複数回ネストできるようになったので、簡単に言うと次のようになります。
my::Vector<int> calc()
{
if(...)
return calcOnCPU();
}
AFAIK、値で返すと、my::Vectorクラスのコピーコンストラクターが呼び出されます。これは次のようなものです。
Vector<int>::Vector(const Vector& c)
{
....
m_vec = c.m_vec; // where m_vec is std::vector<int>
}
いくつかの質問:1)コピーコンストラクターでは、std :: vectorのコピーコンストラクターを呼び出していますか?または代入演算子と確認のために、std :: vectorはディープコピーを作成します(基本的な整数型を考慮してすべての要素をコピーすることを意味します)。2)calc()にcalcOnCPU()をネストすると、それぞれがintのVectorを返します。Vectorの2つまたは1つのコピーが作成されますか?このような単純なメソッドのネストの場合、どうすれば複数のコピーを回避できますか?インライン関数または別の方法がありますか?
更新1:いくつかのカスタム要件があるため、独自のコピーコンストラクターを保持する必要があることが明らかになりました。ただし、main関数で簡単なテストを行いました。
int main() {
...
my::Vector v = calc();
std::cout<<v;
}
コピーコンストラクターで「std::cerr」を使用していくつかのプリントを配置し、いつ呼び出されるかを確認します。興味深いことに、上記のプログラムでは一度も呼び出されません(少なくとも何も印刷されません)。コピーエリジオン最適化ですか?LinuxでGNUC++コンパイラ(g ++)v4.6.3を使用しています。