質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

651閲覧

ヒープ領域のメモリを確保しないメンバ変数のみ持つクラスのムーブコンストラクタの効率性について

nemumitakamaru

総合スコア22

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/02/12 14:53

編集2020/02/12 15:19

ムーブ・ムーブコンストラクタ・右辺値参照等のC++11以降の機能に対しての理解が不十分であり、当たり前の話かもしれませんが、確証が持てないので質問させていただきます。

下記のmain.cppstruct Aのようにヒープ領域のメモリを確保しないメンバ変数のみ持つクラスのムーブコンストラクタはコピーコンストラクタと全く同じ処理を行い、効率性に違いはないという認識で大丈夫でしょうか?

main.cpp

cpp

1#include <iostream> 2 3using namespace std; 4 5struct A 6{ 7 A(double x, double y, double z) 8 : x_(x) 9 , y_(y) 10 , z_(z) 11 { 12 cout << "A::A()" << endl; 13 } 14 15 ~A() 16 { 17 cout << "A::~A()" << endl; 18 } 19 20 // 呼ばれないコピーコンストラクタ 21 A(const A& a) 22 : x_(a.x_) 23 , y_(a.y_) 24 , z_(a.z_) 25 , g_(a.g_) 26 , f_(a.f_) 27 , h_(a.h_) 28 { 29 cout << "A::A(const A& a)" << endl; 30 } 31 32 // 呼ばれるデフォルトムーブコンストラクタ 33 A(A&&) = default; 34 35 double x_; 36 double y_; 37 double z_; 38 int g_; 39 int f_; 40 int h_; 41 42 // メンバ変数出力 43 void Print() { 44 cout << "x_:" << x_ << endl; 45 cout << "y_:" << y_ << endl; 46 cout << "z_:" << z_ << endl; 47 cout << "g_:" << g_ << endl; 48 cout << "f_:" << f_ << endl; 49 cout << "h_:" << h_ << endl; 50 } 51}; 52 53A CreateA(bool flag) 54{ 55 A a(1.5, 2.5, 3.5); 56 57 a.g_ = 4; 58 a.f_ = 5; 59 a.h_ = 6; 60 61 // NRVOされずにムーブコンストラクタを呼び出すための条件分岐 62 if(flag) { 63 return a; 64 } 65 66 A a2(7.5, 8.5, 9.5); 67 a2.g_ = 10.0; 68 a2.f_ = 11.0; 69 a2.h_ = 12.0; 70 71 return a2; 72} 73 74int main() 75{ 76 // Aの一時オブジェクトを作ってAのムーブコンストラクタを呼び出してインスタンスaを初期化 77 A a3 = CreateA(true); 78 79 a3.Print(); 80 81 return 0; 82}

ビルド

clang++ -std=c++14 main.cpp

実行結果

A::A() A::~A() x_:1.5 y_:2.5 z_:3.5 g_:4 f_:5 h_:6 A::~A()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nemumitakamaru

2020/02/13 15:51

PODであれば必ずムーブとコピーの効率性に違いはなく、非PODであれば実装次第という感じですね。
guest

回答1

0

ベストアンサー

はい。 違いはありません。

自動生成されるムーブコンストラクタはもしデータメンバがムーブコンストラクタを持っていればムーブし、そうでなければコピーするという挙動になります。 質問中の例の場合はデータメンバはただコピーされるだけなので自動生成されるムーブコンストラクタは結果的にコピーコンストラクタと差がありません。


自動生成されるコンストラクタのことを脇に置けば、ムーブコンストラクタはそれがムーブの文脈にあることがわかるだけです。 どのように効率的にムーブするかは各クラスの実装次第です。 (一般的にはポインタの交換という形で実現しますが。)

投稿2020/02/12 18:31

SaitoAtsushi

総合スコア5684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nemumitakamaru

2020/02/13 16:01

ご回答ありがとうございます。 結局の所、ムーブコンストラクタの実装次第であり、「ヒープ領域のメモリを確保しない」等は関係ないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問