C++对象模型解析三
来源:互联网 发布:编程流程图 编辑:程序博客网 时间:2024/06/05 16:31
复制构造函数的操作
像default constructor一样 如果一个class没有声明一个复制构造函数,就会有隐式的声明出现。跟之前一样,C++标准会把复制构造函数分为有用的以及无用的,只有有用的实例才会被合成到程序之中,决定一个copy constructor是否是trivial的标准在于class是展现出所谓的bitwise copy semantics。
bitwise copy sematics
以一段代码展示:
class Word{public:Word(const char*);~Word(){delete [] str;}private:int cnt;char *str;}这种声明展现了bitwise copy semantics(逐为拷贝),这时类的初始化并不需要以函数调用完成,只需要按位拷贝。
不是bitwise copy sematics
根默认构造函数类似分四种情况:
1.当class内含一个class object而后者声明有一个复制构造函数时(编译器有义务调用其复制构造函数),就会生成一个non-trivial 复制构造函数。
2.当class继承自一个base class而后者存在一个复制构造函数时,编译器有义务调用基类的复制构造函数。
3.当class声明一个或多个virtual functions时。
4.当class派生自一个继承串链,其中有一个或多个virtual base classes.
前两种情况,编译器必须将member或base class的copy constructors调用操作安插到合成的复制构造函数中。后面两种情况相对复杂:
有虚函数的时候重新设定vptr
这种情况如果是以派生类初始化基类,必须冲洗设定vptr指向基类的虚表。
处理virtual base class subject
虚基类的存在需要特殊处理。一个类对象如果以另一个对象作为初值,而后者有一个虚基类子部分,那么bitwise copy semantics就会失效。编译器需要合成一个复制构造函数,安插一些代码设定虚基类指针或偏移,对每一个members执行必要的memberwise初始化,以及执行其他的内存相关操作。
编译器调用复制构造函数的策略以及这些策略如何影响我们的程序
编译器优化操作NRV:
以一段代码来展示:
X bar(){X xx;return xx;}//经过NRV优化之后:void bar(X &__result){__result.X::X();return;}
- C++对象模型解析三
- C++对象模型解析
- DHTML对象模型 (三)
- Objective-C对象模型
- Objective-C对象模型
- objective C 对象模型
- C ++ 对象模型
- Objective-C 对象模型
- 【C++】对象模型
- Objective-C对象模型
- SDN三种模型解析
- 全面解析VC++对象模型
- C++对象模型解析一
- C++对象模型解析二
- C++对象模型解析四
- C++对象模型解析五
- C++对象模型(三)
- C++对象模型-笔记三
- 利用thread和sleep生成字符串的伪随机序列
- 启动 Eclipse 弹出“Failed to load the JNI shared library jvm.dll”错误的解决方法
- 封装dialog大全
- PHP的简单工厂模式
- JdK源码阅读-集合类
- C++对象模型解析三
- Android Priority Job Queue使用(1)
- more item ListView demo
- 输入流转换字符串(解析)
- Java异常处理
- Spring学习笔记
- Ubuntu14.04上配置Swift3.0环境
- Spark统计词汇量/排行榜/中位数
- 选择排序