| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2309 人关注过本帖
标题:[转] Bjarne Stroustrup 在自己主页上发表的FAQ
取消只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 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 编辑 ]

授人以渔,不授人以鱼。
2013-08-28 09:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
预留空间是根据你增加的次数和频率指数增长的,通过不同的途径到达100,最终的状态不一样,换句话说,不用多少次就已经有128了。

授人以渔,不授人以鱼。
2013-08-28 10:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
比如,push第1次预留4,第2次在前面的基础上再加到8,前后总共有12,加了2次得到12,第3次会暴涨到追加16。在前面数次是会重新调整内存的,但在过后这种机会会极少了,前面重新调整,复制和拷贝数据的量也少,到后面,基本上不需要再做这种拷贝动作了。

见C++ Primer第9章,该书附带的《C++编程规范》第76条、80条。

授人以渔,不授人以鱼。
2013-08-28 11:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
熟悉C的人,就是太熟悉那些细节手段,未必知道新的东西有新的手段,这才是人家反复说不需要暸解太多不需要暸解的细节的原因(不是说不需要暸解细节,是说一些不需要暸解的细节是不需要知道的,知道了反而有害),按照劝告用就是了。面向对象隐蔽了很多细节,而C是公开细节的,两者在意识形态上本就不同,所以C程序员与C++程序员往往争执不下,就是这个原因,像林纳斯那样咒骂C++,也是因此。

[ 本帖最后由 TonyDeng 于 2013-8-28 11:51 编辑 ]

授人以渔,不授人以鱼。
2013-08-28 11:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册

授人以渔,不授人以鱼。
2013-08-28 11:52
快速回复:[转] Bjarne Stroustrup 在自己主页上发表的FAQ
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017471 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved