gpt4 book ai didi

c++ - 使用 std::move 来防止复制

转载 作者:搜寻专家 更新时间:2023-10-31 00:12:58 25 4
gpt4 key购买 nike

我有以下代码:

#include <iostream>
#include <vector>

struct A
{
std::vector<int> x;

A()
{
std::cout << "A()" << std::endl;
}

A(const A&)
{
std::cout << "A(const A&)" << std::endl;
}

~A()
{
std::cout << "~A()" << std::endl;
}
};

struct B : public A
{
std::vector<int> y;

B()
{
std::cout << "B()" << std::endl;
}

B(const A&a)
{
std::cout << "B(const A&)" << std::endl;
x = std::move(a.x);
y.resize(x.size());
}

B(const A&&a)
{
std::cout << "B(const A&&)" << std::endl;
x = std::move(a.x);
y.resize(x.size());
}
B(const B&)
{
std::cout << "B(const B&)" << std::endl;
}

~B()
{
std::cout << "~B()" << std::endl;
}
};

A ret_a()
{
A a;
a.x.resize(10);
return a;
}

int main()
{
std::cout << "section I" << std::endl << std::endl;

A a = ret_a();
B b(a);
std::cout << "a.x.size=" << a.x.size() << std::endl;

std::cout << std::endl << "section II" << std::endl << std::endl;

B b2(ret_a());
std::cout << "b.x.size=" << b.x.size() << std::endl;

std::cout << std::endl << "section III" << std::endl << std::endl;
return 0;
}

带输出(VS2013,发布版本)

section I

A()
A()
B(const A&)
a.x.size=10

section II

A()
A()
B(const A&&)
~A()
b.x.size=10

section III

~B()
~A()
~B()
~A()
~A()
  1. 为什么“第 I 部分”中的 a.x.size() 的大小为 10?我认为 std::move 应该将所有数据从 a.x move 到 y.x

  2. 为什么“section II”调用构造函数 A() 两次?我认为 B(const A&&) 会防止过度复制 A

更新

请参阅 http://pastebin.com/70Nmt9sT 处的固定代码

最佳答案

  1. T&&const T&&不是同一类型。你几乎从不想要 const右值引用 - 你不能窃取它的资源,因为你创建了它 const ! x = std::move(a.x);B(const A&a)拷贝 a.x std::move(a.x) 的返回类型是const vector<int>&& .
  2. 构造器,B(const A&&)调用 A 的默认构造函数因为它来自 A ,并且成员初始值设定项列表不会尝试构造基 A .这是第二个A称呼。

关于c++ - 使用 std::move 来防止复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28623287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com