什么是更好的 -
std::vector<MyClass*>
或者
std::vector<MyClass>
? 我的意思是,第二个选项会在堆中存储对象吗?哪一个更快更干净?
std::vector<MyClass>
在大多数情况下应该是更可取的。是的,默认情况下它会将对象存储在堆中(动态存储)std::allocator
。
优点是对象在向量销毁时自动销毁,并分配在单个连续内存块中,从而减少堆碎片。所以这样更干净。
这种方式也更快,因为它可以最小化内存分配操作。Vector 会在构造对象之前预先分配存储空间,因此对于 N 个对象,它将是 M 次分配操作和 N 次构造函数调用,N > M(N 越大 - 差异越大)。如果您手动创建对象并通过指针将它们放置到向量中,则会导致 M 个分配和 N 个构造,M = N + X,其中 X 是向量存储分配。如果您知道存储对象的数量,您总是可以最小化向量内存分配 - 使用std::vector::reserve()
.
相反,使用std::vector
指针将需要您手动销毁对象,例如调用delete
动态分配的对象。不建议这样做。此类容器只能用作非自有容器。在这种情况下,对象所有权应在外部维护。
是的,第二个版本也将对象存储在堆上,但是以更紧凑的形式,即MyClass
.
在第一种形式中,您必须分配和解除分配对象,而std::vector
在第二种形式中将为您执行此操作。
因此,与往常一样,这取决于您的需求和要求。如果可以选择,请采取第二种形式:
std::vector<MyClass>
它更容易维护。
依靠。当然,将类的副本存储在容器中更容易使用,但是每次都需要运行复制构造函数以将实例保存到容器中,这可能会出现问题。此外,您的容器只能存储一个类 - 特别是它不能存储从您的基类专门(继承)的其他类。因此,一般而言,您通常最终不得不存储指向该类的指针。
存在存储指针的障碍。然而,为了两全其美,请考虑使用 boost::ptr_vector 代替,它具有智能指针的优点而没有开销。
std::vector<MyClass>
将对象存储在堆上(可能),std::vector<MyClass*>
将指针存储在堆上(可能),并将对象存储在创建它们的任何位置。如果std::vector<MyClass>
您需要std::vector<std::unique_ptr<MyClass>>
在适用时再次支持继承,请在适用时使用。如果您的向量不应该拥有这些对象,那么它std::vector<MyClass*>
可能会很有用,但这种情况很少见。