LifeホームサイトについてプログラミングWeb/ブログゲーム開発環境サービス/製品その他ホームプログラミングC++[C++]コンテナへ配列いり構造体を挿入したときの挙動スポンサーリンクC++2017.08.06配列入りの構造体を定義してそれをコンテナへ挿入したとき、どんな挙動になるか正確に把握してますか?ワタシは不安になっちゃいました。いうか、実行した結果、コピーされてたんで思惑通りなんでいいんですけど、どうゆうフローでそうなってるか把握しておかないと気持ち悪い!そんなわけで検証です。000001D35F5CBAD8結果、コンテナの中のインスタンスは、別のアドレスの配列を持ちながらしっかりと内容はコピーされているわけです。以下ざっくりとフロー解説まず、コンテナ挿入時にインスタンスを引数とした場合、コピーコンストラクタが呼ばれます。これはコピーコンストラクタを明示的に定義してブレイクすればすぐに確認できます。ちなみに、「こちらのサイト」でも記載されているとおり、ただのmemcpyではないとの定義があります。それぞれのコピーコンストラクタまたは代入演算子を呼んでくれると。ちなみに、以下の1のときはコピーコンストラクタが呼ばれます。2のときはコンストラクタが呼ばれて代入演算子が呼ばれます。//2となると、ますます配列ってどうなるん?配列って代入で丸コピーなんてできないやん?配列のコピーコンストラクタなんてあるん?とワタシはなります。^^;なんでコピーしてくれちゃうの?デフォルトのコピーコンストラクタの処理ってどうなってるの?というのを解釈するため、コピーコンストラクタ呼び出し部分を逆アセンブルしてみます。すると以下のようになります。[rsi]このアセンブラはcopyインスタンスのアドレスをraxレジスタにロードdataインスタンスのアドレスをrcxレジスタにロードraxレジスタの内容をrdiにコピーrcxレジスタの内容をrsiにコピー28(hexなので10進数だと40)をecxレジスタにコピーbyteコピーをecxの回数繰り返すという意味。デフォルトのコピーコンストラクタは(今回の場合の最適化の結果として)「結局memcpyと同じ処理」をしてるんですね。中身にコピーコンストラクタなどが定義されたクラスインスタンスなどが存在すればアセンブラの内容も変わってました。意外と明確にこの辺を書いてくれてる記事がなかったりする。読めば書いてあるかも。(会社に置いてあるから今度見る・・)というわけで、デフォルトのコピーコンストラクタ呼び出しによって配列はしっかりコピーされるのでした。ポインタで保持させた場合はアドレスコピーだからね!)そいではこのへんで。コメントをキャンセルメールアドレスが公開されることはありません。(1)お問い合わせタイトルとURLをコピーしました。