效率和结构
C++是以C程序设计语言为基础开发出来的,除了少量例外,它继续维持了以C作为一个子集。作为基础语言,C++的C子集设计保证了在它的类型、运算、语句与计算机直接处理的对象(数、字符和地址)之间的紧密对应关系。除了new、delete、dynamic_cast,以及throw运算符和try-块之外,C++的各种表达式和语句都不需要特殊的运行时支持。
C++可以使用与C一样的函数调用及返回序列---或者其他效率更高的方式。在这种相对有效的机制仍然被认为是代价过高之处,C++函数还可以采用在线替换,这样就使我们能在享受到函数记法上方便的同时,又不必付出任何运行时的开销。
C的一个初始目标是在大部分苛刻的系统程序设计工作中代替汇编语言。在设计C++时,也特别注意了不在这些已经取得的领域中做出任何妥协。在C和C++之间的差异,从根本上说,在于强调类型和结构的级别不同。C是有表达能力的和宽容的,而C++的表达能力更强。当然,为了获得这种增强的表达能力,你必须更多地关注对象的类型。知道了对象的类型,编译器就能正确处理表达式;如果不是这样,你就必须自己在令人难受的细节程度上去描述有关操作。知道了对象的类型,编译器就能检查错误;否则这些东西就会遗留下来直至测试阶段---或许留到更晚的时候。请注意,使用类型系统去检查函数的参数,去保护数据不被意外地破坏,去提供新的类型,去提供新的操作,如此等等。这些在C++里都没有增加任何运行时的时间或者空间开销。
C++中特别强调程序的结构,这反映了自C设计以来程序规模的增长情况。你可以通过玩命干做出一个小程序(比如说,1000行),甚至是在你违反了所有有关好风格的规则的情况下。而对于更大的程序,情况就完全不同了。如果一个100 000行的程序的结构及其糟糕,你就会发现,引进新错误的速度像清除老错误一样快。C++的设计就是为了使较大的程序能够以一种合理的方式构造出来,并因此使一个人也有可能对付相当大的一批代码。进一步的目标是使一个平均行的C++代码能够表述出远比一个平均行的C或Pascal代码更多的东西。C++已经证明它超过了这些目标。
并不是每块代码都可能是结构良好的,与硬件无关的,容易阅读的,如此等等。C++也拥有一些特征,其意图就是为了以一种直接了当和高效的方式去操纵硬件功能,而不顾安全性或者容易理解诸方面的问题。它还拥有一些特征,使得我们能够将这样的代码隐藏在优美和安全的界面之后。
很自然,对更大型的程序使用C++语言,将会导致由成组的程序员使用C++。C++所强调的模块化,强类型的界面,以及灵活性在这里都能发挥作用。C++在各种为写大程序而提供的功能之间做了很好的平衡,像其他任何语言一样好。当然,随着程序变得更大,与它们的开发和维护相关的问题也会逐渐从语言的问题转移到更为全局性的工具和管理的问题。第四部分将探讨这方面的论题。
本书强调的是为提供通用功能、普遍有用的类型、库等的各种技术。这些技术能为写小程序的程序员服务,也能为写大程序的程序员服务。进一步说,由于任何非平凡的程序都是由许多半独立的部分组成,写这些部分的技术定能服务于开发所有应用的程序员。
你或许会怀疑,用更细节的类型结构去刻画大程序,会不会导致更大的程序正文?对于C++而言情况并不是这样。一个声明了函数参数类型、使用了类等的C++程序,通常比没有使用这些功能的等价C程序短一点。在那些使用了库的地方,C++程序就要比等价的C程序短得多。当然了,这里还得假定那个功能等价的C程序确实能构造出来。
🔚