《深度探索C++对象模型》是一本由斯坦利•B.李普曼 (Stanley B. Lippman)著作,电子工业出版社出版的平装图书,本书定价:69.00元,页数:320,特精心从网络上整理的一些读者的读后感,希望对大家能有帮助。
《深度探索C++对象模型》读后感(一):吐槽
正在读此书,三点感悟:
1. 内容不错,不过有一些过时的内容,cfront作为大婶们第一个C++编译器早在1993年就被取消了,书上很多数据与现在的编译器已经不一致。
2. 候大婶勘误了很多原著的错误,不过我还是想读一下原著。
3. 请问中文版是用谷歌翻译的吗?各种生硬的翻译腔语句让我看的好痛苦。
...
继续痛苦研读..
《深度探索C++对象模型》读后感(二):非常有深度
很好很强大,也非常深奥,比Effective系列深太多了。只有前5章勉强看懂。
这本书偏重的是C++内部实现,而effective则是讲C++的常用技术。虽然在技术上没有太大帮助,但绝对大大提高内功,会给你剖析了C++ class的实现机制。
建议想深入C++的人都读一读,会有一种醍醐灌顶的作用(原来C++内部是这样实现的啊~)。
以后回头再看第二遍,现在功力不够。
《深度探索C++对象模型》读后感(三):太恐怖了
读的是2012重印的书。内容不错,也并没有因为时隔近二十年而过时多少,然而翻译时加的太多译注让人扫兴!
错误和非错误都擅自修改,比如把==改成=,又重复多次“译注”;把virtual table中虚函数的引号去掉,原因是“怕读者以为是字符串”;各种提醒,请注意,唯恐读者不懂,真不懂的人恐怕连提醒都看不懂,懂的人又多余。
不过加的几幅图到是值得夸奖,然而我对侯捷的译作已经产生了阴影~
.这本书有股奇怪的味道,不是平常书的味道…
《深度探索C++对象模型》读后感(四):C++编译器说明书 + virtual 关键字详解 !
这本书非常适合用来装逼!人活着不为了装逼,那跟咸鱼又有什么区别!
整本书几乎没讲C++的任何语法,任何编程技巧,任何使用经验,说的内容就如标题所言:C++编译器说明书 + virtual 关键字详解 !
看这本书的时候,完全不需要写任何代码去验证。为什么?举个例子,就说虚拟指针这东西,有些编译器放在开头,有些编译器放在结尾,可能有些编译器还放在中间,那验证你所用的编译器的虚拟指针到底是放在哪里有必要么?完全没必要,这样有点教条主义了,谁知道下一代的编译器会怎么做,但是当出现新情况的时候能够分析一二,那就说明从这本书学到东西了。
估计作者的意图也很明显,不需要你学会特别的技巧,目的就是为了让你更好的装逼,为什么说装逼呢?当我第二次看完这本书后,到CSDN论坛找关于C++的一些问题,发现我居然会对一些评论一笑而过,对一个问题,不单能从语法上分析,还能从编译器和编译器优化的角度分析,甚至可以拓展到操作系统的层面上进行分析,当分析不出来的时候,自己还能够提出新的方案,美其名曰:C++标准没给出具体实现。这可能就是读完本书后带来的理解深度加深和思维的扩展。
另一个提升就是不会再去纠结不同编译器产生的不同效果。以前会疑惑,为什么同一段代码,VC6.0是这个结果,codeblock 是那个结果,现在已经能够对不同编译器出现的不同结果进行分析和解释,甚至自己还能够给出一个合理的理由来解释,也就是会开始装逼了~~~ 例如面对 new char[0] 这种蛋疼的语法,显得淡定从容。
这本书我看的很慢,大概3个星期左右才看完,估计以前没有任何内存对象的概念吧,简单笔记:
1. struct 关键字讲了那么多,还真是把读者给搞晕了(可能当时更多地从兼容性来说明),但是在实际中的使用,完全可以从一些好的开源代码中得到借鉴,例如STL。在STL的源码中,大量用到了struct做接口和类型定义,我觉得这种做法可以借鉴。
2. 神奇的NRV 优化,解释了为什么返回时,有时会没有调用拷贝函数。
3. 初始化建议用初始化列表,进行效率提升,初始顺序只跟声明顺序有关。
4. 成员函数,编译器会进行“name mangling” 处理,转换为 func_className_ReType(this) 格式,静态成员函数没有this指针,所以转换为普通的函数,但需要通过类调用 class::StaticFunc, “name mangling” 转换为 staticFunc_class。 虚拟函数通过虚指针进行调用 (*ptr->vptr[slot])(ptr)。
5. 虚拟继承的对象模型,对虚表进行处理,上部分为基类在本对象模型中的偏移地址,下部分为虚函数地址,而虚拟继承的对象构造函数调用过程,编译器在构造函数加了一个参数, bool __most_derived, 最底层的类调用基类的构造函数之后,就将 __most_derived 设置为 false, 这样其他的父类就不再调用基类的构造函数,保证基类只被构造一次。
6. 局部静态变量会产生临时保护对象, new运算符会分两步运行:分配内存,运行构造函数。
《深度探索C++对象模型》读后感(五):痛苦
这本书读的让我闹心。总算读完。可能以后还会重读。
豆瓣这什么图片质量啊
https://www.douban.com/photos/photo/2523592128/large
几个点,帮助更加了解vptr
gdb小知识https://stackoverflow.com/questions/18363899/how-to-display-a-vtable-by-name-using-gdbhttps://stackoverflow.com/questions/6191678/print-c-vtables-using-gdb
g++ -fdump-class-hierarchy可以导出内存布局(.class文件)。不过是所有的。参考http://shouce.jb51.net/cxx-abi/abi.html
橙色线框中的内容仅限于虚拟继承的情形(若无虚拟继承,则无此内容),虚拟继承的讨论已超过了本文的范围,暂且忽略。“offset to top”是指到对象起始地址的偏移值,只有多重继承的情形才有可能不为0,单继承或无继承的情形都为0。“RTTI information”是一个对象指针,它用于唯一地标识该类型。(注:本系列博文后续会有详细讨论。)“virtual function pointers”也就是我们之前理解的虚函数表,其中存放着虚函数指针列表。前一节的示例是单继承的示例,下面列出了一个多继承的示例:从中可以看到:D的虚表中包含两个虚表结构,第一个也称之为“主虚表”(primary virtual table),另一个虚表又称之为“次虚表”(secondary virtual table)。简单地概括一下:一个含有虚函数(无论是其本身的,还是继承而来的)的类,可以有一个主虚表和多个次虚表,主虚表和次虚表构成一个虚表组(virtual table group)。
objdump -S (file nm addr2line readelf)