2016-03-25 10 views
3

背景:コピーのstd ::ベクトル

そのコピーコンストラクタを使用してstd::vectorをコピーするか、次のように割り当てをコピーします。

std::vector<T> v1{T(),T(),T()}; 
std::vector<T> v2 = v1; 

深いコピーが起こります。

Tのコピーコンストラクタが各要素に対してトリガされることが標準で保証されていますか?つまり、memcpy(または類似のもの)は呼び出されません。 (私が間違っているなら私を訂正してください)。

質問:一方

、それは(パフォーマンスの問題のために)プリミティブ型にmemcpy(または類似した何かを)呼んであろうと、標準によって保証されていますか?

+0

"Tのコピーコンストラクタが各要素に対してトリガされることが標準によって保証されていますか?" - 絶対に。どのように他のことができますか?なぜあなたは尋ねますか? – Mikhail

+0

コピーコンストラクタを呼び出さないのは夢中です... – marom

+0

編集してください –

答えて

3

はい、Tのコピーコンストラクタを呼び出す必要があります。コピーコンストラクタが簡単な場合、それはmemcpyのものとまったく同じであるため、実装はにコピーコンストラクタを実装するのにうまくいきます。そこから実装はvectorのコピーコンストラクタを実装するためにmemcpyを使用することを決定するかもしれません。その決定はas-if ruleを利用します:プログラムの観察可能な振る舞いは変わりませんので、実際にはすべてのコピーコンストラクタ呼び出しを実行する必要はありません。一方

、それは ( パフォーマンスの問題のために)プリミティブ型でのmemcpy(または類似した何かを)呼んであろうと、標準で保証のでしょうか?

いいえ、コピーコンストラクタが実際にどのように実装されているかは、実装の詳細です。標準はプログラムの(観測可能な)振る舞いを指定するだけで、コピーコンストラクタなどの概念を使用します。最適化は、抽象標準文書が心配すべきものではなく、あなたのベンダーです。実際、そのような関数の定義を抑制することは、最適化において大きな赤字を招くか、前述のas-ifルールのために完全に無視される。

2

プリミティブ型のコピー構築のために生成される正確なコードは、実装品質の問題です。言い換えれば、標準はを保証しません。最高でも、操作のアルゴリズムの複雑さを指定します。この場合、ベクトルのコピーはO(n)と推測できます。

最新のC++コンパイラを合理的な最適化設定で使用すると、一定サイズのmemcpyと同じくらい効率的に、インラインで実装されているPODクラスのコピー構築が可能です。他に何かをすると、ポインタのSTLコンテナなどの典型的な使用例で深刻な違約金がかかります。