【博客19】vs和linux下的:vector扩容问题

内容: 测试了vs下和linux下使用vector时,它们的扩容是不一样的!在vs下为1.5倍扩容,在linux下为2倍扩容。

测试代码:
【博客19】vs和linux下的:vector扩容问题
【博客19】vs和linux下的:vector扩容问题
结果分析:可以看到vs下为1.5倍扩容,同时大家可以发现进行了24次扩容,也就是说进行了24的原空间释放和新空间分配的过程,这个是比较耗费cpu的。下面会给出比较好的做法。结果的第一个0是刚开始的时候,还没有插入时为0.还有测试容量的时候要对capacity进行查看,而不是对size进行查看,才会比较准确。size是有效空间的大小而已。然后vector的空间分配不全是:旧空间全部拷贝到新空间,释放原空间,在STL源码剖析中有更细致的解释,有空再写一篇来讲述。

接下来看linux的情况:
【博客19】vs和linux下的:vector扩容问题
结果:
【博客19】vs和linux下的:vector扩容问题
分析:可以看到linux g++下,是使用了两倍来扩容的,释放重分配次数降低,但是是一种空间换时间的做法,与vs做法相比时间效率高,空间效率会低,应该是各有利弊吧,不然设计的人都是绝顶聪明,如果1.5和2这两种做法有一种有绝对优势的话,也不会有第二种了。

接下来说一下上面提到的如何尽可能避免:空间重分配问题
代码:
【博客19】vs和linux下的:vector扩容问题
结果:
【博客19】vs和linux下的:vector扩容问题
分析:此时num为1是reserve引起的,后续插入元素过程再也没有重新分配空间了,一开始就指定空间是一种比较好的做法,在你知道大概会使用多少元素时,推荐这么做。然后reserve与resize不要混了,reserve分配的空间还没有初始化的,要跟push_back一起配合使用,resize已经用默认值给你初始化好元素了,可以使用了。说到push_back就想起,c++11后应该养成设计移动构造函数,然后使用emplace_back的习惯会比较好,后面再写一篇来讲emplace_back,最近春招刚好复习到哈哈。

大三学生一枚,文章均非抄袭或者模仿,均为原创,仅代表个人观点,如果文章有错误的地方,欢迎在下方提出,每条评论我都会去认真看并回复,同时感谢指正的前辈。