除了我个人回答这封信,我也把此信转寄给HP公司的 Steve vinoski;先前 我曾与他讨论过C+的效率问题、以下节录自他的响应 过去数年我听过太多与你的同事类似的看法,许多情况下,这些看法是源于 对C艹+事实真象的缺乏∫解,就在上周,我才和一位朋友闲聊,他在一家C制 造厂服务,他说他们不使用C科+,因为“它生你的背后做事情”:我继续追问 于是他说根据他的了解,C+调用mlc和fe丙不让程序员知道.这当 然不是真的.这是一种所谓的迷思与传说,引导出类似于你的同事的看法 在抽象性和实际性之间浅出平衡点,需要知识、经验,以及许多思考,C+的 使用需耍付出许多心力,但是我的经验告诉我,这项没资的报酬率相当高 我喜欢把这x书想象成我对那一封读者来信的同答。是的,这本书是一个知 识陈列库,帮助大家去除围绕在C++四周的迷思与传说 如果C++对象模型的底层机制会因为实现品ⅰ编译器)和时间釣变动而不 同,我如何能够对于任何特定主题提供一般化的讨论呢?静态初始化( Static initialization)可为此提供一个有趣的例子 三知…个 class x有着 constructor;像这样: 1 friend ist operator>>( istream&, xi )i public: xt int sz=1024 I (tr char’ptr 而一个lasx的 global object的声明,像这祥
度探索C+对象模( nside The c+ Objec! modes) x buf: rain《} buf必须社这个时候构造起来 cin > setw 1024 )>> bu +象模型保证, X constructor将在main0之前便把bx/初始化,然而 它并没有说明这是如何办到的.答案是所诣的静态初始化( static initial: zation) 实际做法則有赖开发环境对此的文持属于哪一层级 原始的 cfront实现品不单只是假想没有环境支持,它也假想没有明确的目标 平台,唯一能够假想的平台就是UNX及其衍化钓一共变体。我们的解决之道也 因此只专注在UNX身上:我们使月mm命令。CC命令(一个 UNIX Shell script)产生出一个可扶行文件然后我们把nm施行于其二,产生出一个新的c 文件,然后编译这个新的c文件,再重新链接出一个可执行文件(这就是所谓 的 munch solution).这种做法是以编译器时间来交换移道性, 接下来是提供一个“平台特定”解决之道:直接验证并穿越 COFF-bases程 序的可执行文件(即所谓的 pa chI sulution),不弃需要nr、 compile, relink,COFF 是 Corot: Object File Format的缩写,是 System V pre-Release4LNX系统所 发展岀来的格式。这闖种解决方案郡属于程序层面,也就是说,针对每一个需要 静态初始化的c文件,comt会产生一个sa函数,执行必要的初始化操作 不论是 patch solution或是 munch solution,都会去寻找以sa开头创函数,并且 安排它们以一种未被定义的次序执行起来(经由安插在mm0之后第一行的 个 library function_mmn0执行之)(泽注:本书笫6章对此有详细说明) System V COFF- speci:ic C++编译器与 cfront的各个版本平行发展。由于瞄 准了一个特定平台和标定操作系统,亥编译器因而能够影响链接器特为它修 改:产生出…个新的 Ini sechion,用以收集需要静态初始化的 bisects.链接器的
这种扩充方式,提供了所谓的 enviro ment- basec solution:那当然更在 progran based solution层次之上 至此,任何以 cfront program- asec solution为基础的一般化(泛型)操作将 令人迷惑、为什么?因为C++已经成为主流语言,它已经接收了更多更多的 evironment- based solutions。这本书如何维护其间的平衡呢?我的策略如下:如果 在不同的C+编译器上有重大的实现枝术差异,我就至少讨论两种做法.但如 果 cfront之后的编译器尖现模型只是解决 cfront原本就已理解的间题,例如对 虚拟继承的支持,那么我就阐述历史的洹化,当我说到“传统模型”时,我的意 思是 Stroustrup旳原始构想(反映在 cfront身上),它提供一种实现模式,在今 天所有的商业化实现品上仍然可见 本书组织 第1章,关于对象( Object Lessons),提洪以对象为基础的观念背景,以及 由C艹+提供的面向对象程序设计典范( paradigm.译注;关于 paradigm这个 请参阅本书#22页的译注),本章包括对于对象模型的一个大略浏览,说明目前 普及的工业产品,但没有对多重继承和虚拟继承有太靠近的观察(那是第3章和 第4章的重头戏) 第2章,构造函数语意学( The Semantics of Constructors),详细讨论 constructor如何工作本章炎到 constructors何时被编译器合成,以及给你的程 序效率带来什么样的意义 第3章至第5意是本书的重要题材,在这里,我详细地讨论了C+对象模 型的细节.第3章,Data语意学( The semantics of dats),讨论 data members的 处理.筒4章, Function语意学( The Semantics of Function),专注于各式各样 的 member functions,并特别详细地讨论妇何支持 virtual functions.第5章,构 造,解构、拷贝语意学( Semantics of Construction, Destruction, and Copy),讨 论如何支持 class模型,也讨沦到obet的生命期.每一章都有澳试程序以及臾
深度探罴C++对象模型( inside The C++ Object Mode 试数据.我们对效率的预测将拿来和实际结果做比较 第6拿,执行期语意学( Runtime Semantics):检视执行期的某些对象模型 行为,包括临时对象的生命及其死亡,以及对new运算符和 delete运算符的支 第7章,在对象模型的尖端【 On the Cusp of the Object Model),专注于 exception handling, template support, runtimc type identification 预定的读者 这本书可以扮演家庭教师的角色,不过它定位在中级以上的C++程序员 而非C++新手.我尝试提供足够的内容,使它前够板任何有点C++基础(例如 读过我的C艹+ Primer并有一些实际经验)的人接受,理想的读者是,曾经有过 数年的C艹程序经验:希望进一步了解“底层做些什么事”的人.书中某些部 分甚至对于C+高手也具有级引力,比如临封性对象的产生,以及 amed return value(NRV)优化的细节等等。在与本书素材相同的冬个公开演讲场合中,我E 经证实了这些材料的吸引力 程序范例及其执行 本书的程序范例主要有两个目的 1.为了提供书中所谈的C++对象禛型各种概念的具体说明 2.提供测试,以测量各种语言性质的相对成本 无论哪一种意图,都只是为了展现对象模型,举例而言,虽然我在书中有大 量的举例,但我井非建议一个真实的3 D graphic library必须以虚拟继承的方式来 表现一个3D点(不过你可以在[ POKOR94]中发现作者 Pokomy的确在这么 做
前言 书中所有的测试程序都邵 SGl Indigo2xt.上编译执行,使用S(s2 UNX操作系统的CC和NCC编译器,CC是 cfront3版(它会产生出C 码,再由个C编译器重新编译为可执行文件)。NCC是 Edison Design GrouP 的C++fo-end219版:内含一庄SG!供应的程序代码产生器.至于D间测 量,是采用UNX的timx命令针对一千万次代测试所得的平均值 虽然在x机器上使用这两个编译器,读者而言可能觉得有些神秘,我却 党得对本书的目的而言,很好,不论是 cfront或现在的 Edison Design Groups C++ front-end( Bjarne称其为‘ efron的儿子”),都与平台无关,它们是·仲 般化的编译器,被授权给34家以上的计算机制逅商(其中包括Gray、SGl Inte)和软件开发环境厂商(包括 Centerline和 Novell,后者是原先的UNX软 件实验室),效率的测量非为了对目前市上的各家编译系统进行评比,而只 是为了提供C++对象模型之各种特性的一个相对成本测量至于商业评比的效 率数据,你可以在几乎任何一本计算机杂志的计算机产品检验报告中获得 致谢 略 参考书目 [BALL92]Ball, Michael, "Inside Templates" C++ Report(September 1992) [BALL93a]Ball, Michael, "What Are These Things Called Templates", C-+ Report (Fe brary [993) [BALL93b] Ball, Michael, "Implementing Class Templates" C++Report(Septemter [BOOCH931 Boach, Grady and Michael Vilot, "Simplifying the Booch Components" C++ Report( June 1993) BORE91] Borland Language Open Architecturc Handbook, Dorland Intemational Inc tts valley Ca LBOX95] Box, Don, "Build: ng C++ Components Using OLE2" C++ Report (March/April 1995) [BUDD91] Budd, Timothy, An ]ntroduction to Object-Oriented Programming Addison-Wesley Publishing Company, Rcading, MA(1991