【发布时间】:2021-11-15 14:35:30
【问题描述】:
我的问题:
仅包含 STL 容器的类可以使用Rule of Zero,因此不必手动编写析构函数/副本等。
我想知道是否有为最简单的情况设计的 STL 工具(具有上述属性):一个元素(在堆上)?
解释我们什么时候需要这个:
好吧,这个问题更小众/假设:我们有一个对象Foo 有很多成员(n 成员)。 Foo 被移动复制了很多,以至于将其数据存储为单个堆对象是值得的(因此它可以代替n 浅拷贝它可以只做1)。有时也会被深度复制。
我们可以通过使用带有一个元素的vector 来解决这个问题:
class Foo
{
struct Data
{
char gender;
int age;
std::string name;
// lots of data
};
std::vector<Data> data;
public:
Foo () : data(1) {}
void Input (char c, int x, const std::string & str)
{
auto & d = data[0];
d.gender = c;
d.age = x;
d.name = str;
}
void Print () const
{
auto & d = data[0];
std::cout
<< d.gender << std::endl
<< d.age << std::endl
<< d.name << std::endl;
}
};
为了避免构造函数和所有那些 [0]s 我们可以 wrap the vector into its own class,但这感觉就像一个 hack - vector 是过度杀戮并且可以容纳额外的内存(size 和 capacity 如果编译器不会优化)。
请注意,unique_ptr 和 shared_ptr 对此有不同的复制配置文件,因此在这里没有帮助 (example)。此外,这个问题与pimpl 相似但又不完全相同,因为这里我们定义了一个类型(使用pimpl 我们甚至不能使用上面的vector 技术)。
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。
标签: c++ pointers stl containers