如果std :: vector包含的元素大小增加,是否必须调整大小?

时间:2019-07-12 00:31:08

标签: c++ memory heap-memory stdvector

很抱歉,这是否太基本了,无法在此处提出;我已经阅读了一些有关std :: vector的信息,并且我了解到当大小达到容量时必须重新调整大小。如果对象中包含的对象很大,因为它必须复制每个对象,那么这可能是一项昂贵的操作。

我的问题是:std :: vector如何处理包含的对象的实际大小?假设我初始化了一些

std::vector<Obj> vec(100);

每个Obj都初始化为很小的东西。但是如果我接着做类似的事情

vec[14].ENGORGIO()

因此它现在需要更多的内存。由于std :: vector的元素存储在连续内存中,这是否意味着它必须调整大小(价格昂贵!)

为避免这种情况,我应该将指针存储在向量中而不是对象本身吗?像这样

std::vector< std::unique_ptr<Obj> > vec;

谢谢

2 个答案:

答案 0 :(得分:2)

C ++中数据类型的大小是在编译时设置的,不能更改。数据类型可能包含对其他对象的引用,并且这些其他对象的大小可能有所不同,但是引用的大小以及数据类型都没有变化。

考虑vector中的vector个。内部vector可以包含0个元素或数十亿和十亿,并且其大小始终相同。外部vector仅知道它包含0个或多个vector,而对内部vector中包含的内容一无所知。

您不必为此担心。

答案 1 :(得分:0)

每种类型都有一个大小,并且该类型的所有对象都具有相同的大小。在整个程序中,对象的大小永远不会改变。因此,您描述的场景不存在。

通过间接实现矢量“调整大小”而不更改矢量对象大小的方式。元素不是对象存储器的一部分。而是,向量指向动态内存中的缓冲区。调整大小是通过创建更大的动态缓冲区并在销毁旧缓冲区之前从旧缓冲区复制元素来完成的。