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++的任何语法,任何编程技巧,任何使用经验,说的内容就如标题所言: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运算符会分两步运行:分配内存,运行构造函数。
有关键情节透露