标题:[转] Bjarne Stroustrup 在自己主页上发表的FAQ
只看楼主
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
再来几段Stroustrup的语录:

由于几方面的原因,宏已经成为讨厌、恶心、杂乱的混合体,其中最主要的原因在于它们被吹捧为一种文本替换设施,其效果在预处理阶段就产生了,而此时C++的语法和语义都还没有起作用。


我讨厌大多数形式的预处理器和宏。C++的目标之一就是使C的预处理器成为多余的,因为我认为其操作天生就容易出错。


关于宏的第一规则就是:不要使用它,除非不得不用。几乎每个宏都说明程序设计语言、程序或者程序员存在缺陷。


——摘自《C++编程规范》第16条“避免使用宏”

授人以渔,不授人以鱼。
2011-10-02 10:48
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
得分:0 
排版不行啊。。
2013-08-21 18:45
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
不能重新排版啊

授人以渔,不授人以鱼。
2013-08-21 18:57
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
C++特别版我正在看,看了半年了,才看到第四章,呵呵
进度很缓慢...
因为太厚了,实在不适合抱着在床头看

我感觉C++在C11和C14出来之后应该是还能再焕发第二春的...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-22 15:26
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
其实B.S追求简洁,但实际上他发明的C++是语法最复杂的。他自己推崇模板,但实际上有比模板更好的解决方案。上面的说话,就C++语言的评价部分看,仍然摆脱不了自家的孩子的感觉,所以我同意他不与别的语言对比的看法。关于应该如何学习编程语言,以及应该更关注什么的问题,很多还是不错的,我建议大家看的也是这些内容。

授人以渔,不授人以鱼。
2013-08-22 18:39
zhaoya881010
Rank: 9Rank: 9Rank: 9
来 自:芒砀古郡
等 级:蜘蛛侠
威 望:1
帖 子:339
专家分:1177
注 册:2010-11-21
得分:0 
回复 楼主 TonyDeng
Linux之父Linus Torvalds:C++一无是处
发表于2010-06-12 09:35| 45477次阅读| 来源solidot| 0 条评论| 作者 .LinusTorvaldsC++C面向对象. 摘要:Linux之父Linus Torvalds曾经在三年前,因为微软的一位同学质疑Git用C语言开发,而将C++痛批了一顿(参见 Linux之父炮轰C++:糟糕程序员的垃圾语言 )。当时,他是这样评论的: C++正处在困
Linux之父Linus Torvalds曾经在三年前,因为微软的一位同学质疑Git用C语言开发,而将C++痛批了一顿(参见Linux之父炮轰C++:糟糕程序员的垃圾语言)。当时,他是这样评论的:

C++正处在困境当中,它既无助于简化,以实际用于进行原型化或者简单的GUI编程,又不是像C那样的简洁的系统编程语言,能够积极地鼓励你使用简单和直接的语言构造。
2010年6月5日到11日,他又在邮件列表中连续发贴,直截了当地炮轰C++。他明确表示:“我确实不喜欢C++,依我来看,它真的是一门很烂的语言。”

他还说,C++语言想解决的问题都不对路,都是一些皮毛问题,而没有涉及真正深层次的问题。C++的对象、模板和函数重载都基本上纯粹是C的语法扩展,是语法糖,总体上把C的语法和类型系统都弄得更糟。他建议,在系统编程里直接用C就可以,非系统编程里,应该选择一种有垃圾收集的语言,C++语言的特性基本无用,只会捣乱。因此,什么时候C++都不可能是正确的选择。

在另一个帖子中,他进一步说明,内核开发使用C语言而非C++的理由之一,是交流。在庞大的项目中,人们对不是自己开发的模块并不了解,能快速理解其他模块中函数的确切含义才能提高开发效率。而C++引入的各种抽象则使代码非常依赖上下文,想理解一段代码,需要看多得多的上下文。对于需要不断打补丁(小段代码)的内核来说,这是非常要命的。Linus也承认,在其他一些情况下,可能需要更多语言支持,语言级的内存分配机制如垃圾收集、并发、动态代码生成等等。但是内核开发不需要。而且,即使是这些方面,C++也不灵。他不忘嘲笑C++的new关键字很蠢。

有人问到,C++没有解决的深层次问题是什么?Linus回答,比如并发。他进而又痛批了一通:C++是狗屎,根本没啥设计,只是在C上面加了些渣滓而已。

有人问Linus对Go语言怎么看。他回答,Go语言里有些不错而且重要的东西值得关注,许多决策都很合理。但设计者自己称这个语言为实验性的,这当然有其原因。而且,引入一种新语言没那么容易,过二十年再说吧。

此外,Linus还在另一个帖子里痛批了面向对象语言。他认为面向对象语言以对象为核心,加一些相关联的方法,简直是呓语。重要的东西应该是数据结构,对象本身有啥重要?真正有意思的,是在不同类型的不同对象交互而且有锁规则的时候。但是,即使是这时候,封装什么“对象接口”也绝对错误,因为不再是单一对象的问题了。他的结论是,面向对象解决的都是一些小问题。

Go Go Go
2013-08-24 10:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
诅咒是很低级的行为

授人以渔,不授人以鱼。
2013-08-24 19:29
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
回复 9楼 TonyDeng
说实话,我一直以为前者效率高

并且,当我只是需要一个定长数组,而不需要改变大小时...
我一向是在声明时定义大小...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-28 09:24
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
peach5460
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:武汉
等 级:贵宾
威 望:30
帖 子:2780
专家分:6060
注 册:2008-1-28
得分:0 
回复 19楼 TonyDeng
额...
Vector的原理我懂...

我以前是这么理解的...举个例子...
比如我需要100个空间...
声明的时候写100,我觉得内存可能分了128...
但是声明的时候不写的话...
我觉得可能先分了32...然后我push到一定阈值的时候,重新分成了64
最终我push100次时,分到了128...
这样的话我就感觉多分配了这么多次肯定很慢...

当然,我没试过,只是一种想当然的直觉...

我总觉得授人以鱼不如授人以渔...
可是总有些SB叫嚣着:要么给代码给答案,要么滚蛋...
虽然我知道不要跟SB一般见识,但是我真的没修炼到宠辱不惊...
2013-08-28 10:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-351085-1-1.html




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

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