【发布时间】:2021-10-13 21:49:20
【问题描述】:
我有一段代码可以检查move 是否发生。
struct Foo
{
Foo() = default;
Foo(Foo&& other) = default;
double a[1000];
double b[1000];
};
Foo giveMe()
{
Foo ret;
std::cout << &ret << std::endl;
return ret;
}
int main()
{
Foo o1 = giveMe();
std::cout << &o1 << std::endl;
return 0;
}
好吧,事实并非如此。例如ret和o1的地址如下:
008F7D78
008FBC08
但是,在移动构造函数稍作改动后:
struct Foo
{
Foo() = default;
Foo(Foo&& other) {}
double a[1000];
double b[1000];
};
收件人相同:
010FBE28
010FBE28
这里发生了什么?我认为这种行为在某种程度上与 POD 或 trivial 类型有关,但我不确定如何。
【问题讨论】:
-
“移动”意味着将资源从一个实例移动到另一个实例。不要将实例移动到另一个内存地址。
-
@churill 我知道。地址检查只是为了查看是否发生了移动或复制。
-
依赖于编译器,编译flags。
-
"稍作改动后" 第一个 sn-p 移动(因此复制此类型)成员,而第二个 sn-p 不初始化成员。
-
@tucna 我认为你对搬家有一点误解。想象一下
Foo a; Foo b(std::move(a));这将调用 move-ctor 但两个对象将具有不同且恒定的地址。并考虑到静态数组永远不能移动,只能复制,所以你的 move-ctor 和 copy-ctor 一样。