1

什么是更好的 -

std::vector<MyClass*>

或者

std::vector<MyClass>

? 我的意思是,第二个选项会在堆中存储对象吗?哪一个更快更干净?

4

4 回答 4

5

std::vector<MyClass>在大多数情况下应该是更可取的。是的,默认情况下它会将对象存储在堆中(动态存储)std::allocator

优点是对象在向量销毁时自动销毁,并分配在单个连续内存块中,从而减少堆碎片。所以这样更干净。

这种方式也更快,因为它可以最小化内存分配操作。Vector 会在构造对象之前预先分配存储空间,因此对于 N 个对象,它将是 M 次分配操作和 N 次构造函数调用,N > M(N 越大 - 差异越大)。如果您手动创建对象并通过指针将它们放置到向量中,则会导致 M 个分配和 N 个构造,M = N + X,其中 X 是向量存储分配。如果您知道存储对象的数量,您总是可以最小化向量内存分配 - 使用std::vector::reserve().

相反,使用std::vector指针将需要您手动销毁对象,例如调用delete动态分配的对象。不建议这样做。此类容器只能用作非自有容器。在这种情况下,对象所有权应在外部维护。

于 2012-11-03T20:50:24.073 回答
4

是的,第二个版本也将对象存储在堆上,但是以更紧凑的形式,即MyClass.

在第一种形式中,您必须分配解除分配对象,而std::vector在第二种形式中将为您执行此操作。

因此,与往常一样,这取决于您的需求和要求。如果可以选择,请采取第二种形式:

std::vector<MyClass>

它更容易维护。

于 2012-11-03T20:44:24.943 回答
0

依靠。当然,将类的副本存储在容器中更容易使用,但是每次都需要运行复制构造函数以将实例保存到容器中,这可能会出现问题。此外,您的容器只能存储一个类 - 特别是它不能存储从您的基类专门(继承)的其他类。因此,一般而言,您通常最终不得不存储指向该类的指针。

存在存储指针的障碍。然而,为了两全其美,请考虑使用 boost::ptr_vector 代替,它具有智能指针的优点而没有开销。

于 2012-11-03T20:54:18.737 回答
0

std::vector<MyClass>将对象存储在堆上(可能),std::vector<MyClass*>将指针存储在堆上(可能),并将对象存储在创建它们的任何位置。如果std::vector<MyClass>您需要std::vector<std::unique_ptr<MyClass>>在适用时再次支持继承,请在适用时使用。如果您的向量不应该拥有这些对象,那么它std::vector<MyClass*>可能会很有用,但这种情况很少见。

于 2012-11-03T20:54:25.583 回答