这是非常好的一本书,对于C++有一些经验的人是非常好的学习材料。这本书的版本很老了,近二十年没有更新了,没有对最近的编译器技术做跟进,似乎也没有这方面的必要,作者也不打算更新了。读者需要注意,本书的定位是中级的C++程序员,而不是新手。我13年末,14年初学习了两遍。感悟颇多。虽然那时候还没有正式的用C++做项目,只是自己写一些小的片段代码,但是,我看那时的笔记,还是不由得佩服本书的水平,那时提出的一些疑问,我现在也没有很好的答案。或许,我还需要在这方面更加深入的钻研。
本书经常从语义的角度,也就是语法设计的角度来做讲解,这是非常好的,语法的设计不一定合理,我们需要从更高的角度去思考。
本书关注的主题比较底层,偏向了C++编译器的实现。我在刚开始学习的时候,也是对C++对象,静态代码,动态运行数据在内存中如何分布等充满了疑问,也是看了《Linker and Loader》《程序员的自我修养:链接、装载与库》后才有了一些概念,看了这本书后才有了深入一点的理解。把上层的语法和底层实现连接起来,才能写出更加合理的程序。
很多人可能是使用Visual Studio作为IDE开始学习C++的,可能看到了STL那些反人类的代码,可能对C++的感觉就不好了。这个锅,需要VS的STL作者来背,其他平台的STL代码还是很不错的,特别是GCC所用的版本,可读性很好。(需要使用Linux才能接触到)
很多同学使用C++做界面开发或者普通的桌面程序,也并不会意识到节省内存或者提升程序性能的紧迫性。如果你做算法,做超大量的计算,这些问题都需程序员深入下去研究,做到极致。比如我们程序中的物理引擎需要使用Eigen,一个纯头文件的数学库,里面的数据结构和算法超级复杂,为了省内存真的是锱铢必较。 很多图形图像相关的lib,如OpenCV,CGAL,PCL等,把C++ 使用到了极致。做图像相关的计算量简直是要人命,机器学习的代码跑起来几天几夜,深度摄像头每帧输出的数据用来做计算,分分钟教你重新认识编程。所以,学习好C++还是非常有用的,就看你用不用得到了。如果用不到,也不要贸然的去批评。
当我在看很早十几二十年以前的技术书籍的时候,头脑中一定要有一些基本的概念,比如,2005年以前电脑都是单核的,90年代的C++编译器有很多的,而且很多都是收费的,而且收费巨贵,一个license好几千,现在的电脑比得上10年前的超算也不是说笑的,锱铢必较的省“那一点”内存是要贵死人的。我们需要带着发展的眼光看。C/C++中很多节省内存的技巧你可以直接忽略掉,重载、异常、STL等带来的性能损失也可以忍受,我们的工程代码量越来越大,如何从软件工程的角度和程序效率之间做到平衡,这才是我们应该去思考的问题,也是前辈们在书中常强调的。
值得一提的是作者 Stanley B.Lippman在九十年代初左右,和Bjarne Stroustrup在一个团队工作,Bjarne负责语言的设计和原型,Stanley是小弟,负责写编译器这样的力气活。本书有英文版PDF可下载,中文版则是由侯捷老师翻译的,大家反响很好,推荐阅读。
老笔记整理重发。