回复 18楼 peach5460
vector就是用来实现动态数组的(不需要GCC强制C99新加的那种做法),当数组定长时,vector的优越性无多大体现。vector动态变化的机制,是它有预分配內存动作,即你申请4个单元的时候,它实际上申请了8-10个,用来留给后面的需求,然后假如你再申请4个,这次就不是多申请8-10个了,而是会预留20,因为它察觉你的需求会不断增长,就会预留更多,这样预留的内存使增长速度更快,而且内存是连续的(这对vector转化为内部数组来说很重要)。由于vector承诺内存必定是连续的,所以间断动态申请内存,有时候要挪动内存重新整理,元素数量越大,整理的消耗也越大。一次申请若干元素的空间,在该空间内的效率确实高,但预留的空间却不多(它假定你差不多了,若非期望只有这些,你不必一次指定这些,所以它据此认为你只需要这些),当你要改变尺寸,就极可能遇到整理问题,此时运行时动态速度反而会降低。但若是逐个追加的话,你每一次追加,它都申请更多的空间,以后整理的机会就越小,若干次之后,几乎都不需要新申请了,那可能比你一次申请的还要多,也就是说,后面的push_pack()几乎是没有实际申请内存的。vector毕竟不是list,确保内存连续,是它的承诺,如果不需要内存连续,动态增删元素,链表的效率更高。但正如C++ Primer所说,当你找不到不用vector的理由时,就坚决使用vector好了,它是优先选项。
有人对C99的VLA推崇备至,以为解决了动态数组的问题,但其实这只是GCC在C99之前就已经有的非标准扩展,然后它推动C99标准纳入了这种行为,把非标准弄成了标准。C99是针对C语言的,VLA也只在支持C99的C编译器上使用,当你不用C的时候,根本就用不着VLA,习惯了VLA,转移到非C语言比如C++时,就发现C++没这种东西,那可是会影响思维的,因为你的设计模式已经形成了习惯。除了解释语言,以及使用动态可变数据类型的语言,很少在类型固定语言上有VLA这种机制的,在理论上就不该有——设想一下在运行中特别是人机交互时输入了非法的数组寸尺时将会怎样即可。VLA这样的东西,在BASIC刚出的时候就已经有,这种理念本不新鲜,若C肯接纳,一开始就应该有了,何必等到C99才开始有。有些编译器和平台,内定了40M的栈尺寸,它当然可以奢侈到在栈上使用VLA,不过对内置栈尺寸没那么大的编译器和平台来说,支持它就是自己找死。须知标准只是一种约定,当人家不愿意接受的时候,约定就不存在,它又不是什么法律,不是非守不可的。那种总拿标准来说事的,其实很无聊,这就是我在《关于C标准》主题中首先摘出标准的那几条问答的原因——C的标准刻意不确定正是为了照顾各家编译器的自由,这本是该标准的核心原则。
[ 本帖最后由 TonyDeng 于 2013-8-28 10:01 编辑 ]
授人以渔,不授人以鱼。