堆上的一个元素是否有一些 STL "container"?
Is there some STL "container" for one element on the heap?
我的问题:
类 仅包含 STL 容器可以使用 Rule of Zero,因此避免了手动编写 destructor/copies 等
我想知道是否有针对最简单的情况设计的 STL 工具(具有上述 属性):一个元素(在堆上)?
解释一下我们什么时候需要这个:
好吧,这个问题更多了 niche/hypothetical:我们有一个对象 Foo
有很多成员(n
成员)。 Foo
被移动复制了很多,以至于值得将其数据存储为单个堆对象(因此它可以只执行 1
而不是 n
浅拷贝)。它有时也会被深度复制。
我们可以通过使用 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]
,我们可以 wrap the vector into its own class,但这感觉像是一个 hack - vector
对此有点过度杀戮并且可以容纳额外的内存( size
和 capacity
如果编译器没有优化)。
请注意,unique_ptr
和 shared_ptr
对此有不同的复制配置文件,因此在这里没有帮助(example). Also, this problem is similar to but not quite the same as pimpl,因为这里我们有一个定义的类型(使用 pimpl 我们甚至不能使用上面的 vector
技术)。
您可能正在寻找所谓的 deep/clone/copy/value 指针 (基本上是具有深度复制功能的唯一指针)。甚至还有一个提案,不知道它的实际状态:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3339.pdf.
AFAIK,到目前为止还没有被接受。也许,一些外部库提供了它(Boost?)。
相关问题: 在其接受的答案中,有一个 link 到某个库,它应该提供所需的功能。好像没维护了,不过应该还能用吧
您可以google获得更多解决方案。例如,您可以复制粘贴(并可能查看)此实现:https://vorbrodt.blog/2021/04/05/stddeep_ptr/.
相信大家在Code Reivew网站上也能找到一些解决办法,比如:DeepPtr: a deep-copying unique_ptr wrapper in C++。我认为使用 std::unique_ptr
并用深层复制功能包装它是个好主意。
我的问题:
类 仅包含 STL 容器可以使用 Rule of Zero,因此避免了手动编写 destructor/copies 等
我想知道是否有针对最简单的情况设计的 STL 工具(具有上述 属性):一个元素(在堆上)?
解释一下我们什么时候需要这个:
好吧,这个问题更多了 niche/hypothetical:我们有一个对象 Foo
有很多成员(n
成员)。 Foo
被移动复制了很多,以至于值得将其数据存储为单个堆对象(因此它可以只执行 1
而不是 n
浅拷贝)。它有时也会被深度复制。
我们可以通过使用 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]
,我们可以 wrap the vector into its own class,但这感觉像是一个 hack - vector
对此有点过度杀戮并且可以容纳额外的内存( size
和 capacity
如果编译器没有优化)。
请注意,unique_ptr
和 shared_ptr
对此有不同的复制配置文件,因此在这里没有帮助(example). Also, this problem is similar to but not quite the same as pimpl,因为这里我们有一个定义的类型(使用 pimpl 我们甚至不能使用上面的 vector
技术)。
您可能正在寻找所谓的 deep/clone/copy/value 指针 (基本上是具有深度复制功能的唯一指针)。甚至还有一个提案,不知道它的实际状态:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3339.pdf.
AFAIK,到目前为止还没有被接受。也许,一些外部库提供了它(Boost?)。
相关问题:
您可以google获得更多解决方案。例如,您可以复制粘贴(并可能查看)此实现:https://vorbrodt.blog/2021/04/05/stddeep_ptr/.
相信大家在Code Reivew网站上也能找到一些解决办法,比如:DeepPtr: a deep-copying unique_ptr wrapper in C++。我认为使用 std::unique_ptr
并用深层复制功能包装它是个好主意。