【发布时间】:2013-10-31 10:42:57
【问题描述】:
我有一个以 stl std::string 为成员的 c++ 类 Foo。此外,我有一个 STL std::vector<Foo> vecFoo 按值包含类 Foo 的对象(不是指向 Foo 对象的指针)。现在有朋友建议我不要以这种方式实现它,而是用指针构建向量:std::vector<Foo*> 或使用 boost 智能指针。他讨论了当包含的类具有像std::string 这样的动态成员时,涉及对其成员的大量复制操作(在添加成员时分配更多空间等)的向量会产生问题。会不会出现什么问题?
据我了解,std::string 实际上会在类 Foo 可能被 std::vector 复制时进行深度复制(或写入时复制),因为 Foo 为其所有成员调用复制构造函数。我的朋友争辩说,当向量分配新空间时,如果向量中所有 Foo 对象中的字符串成员的长度不同,这是一个问题。你怎么看?
在向量内使用指向Foo 的指针的唯一原因是速度。指向 Foo (Foo*) 的指针的复制速度比完整的类 Foo 快得多,不是吗?
谢谢讨论!
【问题讨论】:
-
afaik,std::vector 将它的“值”存储在堆上,因此使用指针对我来说毫无意义
-
这个问题有点太开放了,可能会被关闭。但是,我建议您坚持当前的方法,直到您证明这是一个真正的问题(移动语义意味着它可能永远不会出现)。
-
你有 C++11 吗?如果是这样,请给您的班级
nothrow移动复制构造函数和移动赋值运算符。这将使所有内部移动变得便宜。但总的来说,先剖析再看。 -
@juanchopanza 或者更好,不要,让编译器来做。
-
@BoBTFish 同意,但这是假设该类型没有禁用默认的移动复制和分配特殊功能。