我有一个带有 STL std::string
的 C++ 类 Foo作为成员(member)。此外,我还有一个 STL std::vector<Foo> vecFoo
按值包含 Foo 类的对象(不是指向 Foo
的对象的指针)。现在一个 friend 建议我不要以这种方式实现它,而是用指针构建 vector :std::vector<Foo*>
或使用升压智能指针。他讨论了一个 vector ,它涉及对其成员的大量复制操作(在添加成员时分配更多空间等),当包含的类具有动态成员时会出现问题,如 std::string
。 .会不会出现什么问题?
据我了解std::string
当类 Foo 可能被 std::vector
复制时,实际上会进行深度复制(或写时复制) ,因为 Foo 为其所有成员调用复制构造函数。我的 friend 争辩说,当 vector 分配新空间时,如果 vector 中所有 Foo 对象的字符串成员长度不同,这是一个问题。你怎么看?
使用指向 Foo
的指针的唯一原因 vector 内部是速度。指向 Foo (Foo*
) 的指针比完整类 Foo
的复制速度快得多,不是吗?
感谢讨论!
最佳答案
我想,如果您要使用 new
分配每个元素对象,带有指针的 std::vector
根本不会更有效率。但是,如果您的元素对象足够大(不是因为字符串长度,而是因为它的“非指针”成员),带指针的 vector 可以或不表现更好——这取决于 vector 重新分配频率。
考虑 std::vector
分配空间很少的事实,因为它分配的空间总是比之前分配的空间多两倍。
C++11 的情况甚至更好,其中 std::vector
将使用 move semantics以避免肯定复制字符串的字符。但是如果你的编译器不生成 default move constructor,你可能需要在你的类中实现移动构造函数才能让这个东西工作。 .
甚至在 C++11 之前,一些 std::string
实现就使用了写时复制策略,因此仅对字符串进行“深度复制”不需要复制底层字符数组,除非其中之一拷贝已修改。
it is a problem if the string members are of different length among all Foo objects in the vector
这肯定不是问题 - std::string
对象,当然,在内部持有指向字符数组的指针,而不是数组本身。
我敢肯定,在做出这种级别的优化决策之前,您应该使用探查器分析您的程序。
关于c++ - std::vector 中包含的类中的 STL 字符串成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19704323/