ムーブ・ムーブコンストラクタ・右辺値参照等のC++11以降の機能に対しての理解が不十分であり、当たり前の話かもしれませんが、確証が持てないので質問させていただきます。
下記のmain.cpp
のstruct 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()
回答1件
あなたの回答
tips
プレビュー