C++编译期系列
来源:互联网 发布:python 查看数据类型 编辑:程序博客网 时间:2024/05/01 05:47
构造函数中的初始化列表的内存预设值;
说到初时化列表, 大家都会从<C++ Primer>上面发现这两句话:
1. 效率更高;
2. 初始化列表初时化顺序依据类定义的顺序, 而不是依据初始化列表中的先后顺序;
在<inside C++ object model>中还会发现:
3. 子类是无法在自己的初始化列表中初始化基类成员的;
为什么高效? 为什么要保持顺序? 为什么不能初始化基类成员?
1. C++标准: 一个对象, 它的内存结构是: (同一个访问级别内)依照成员变量的定义顺序;
其实所有的C++编译器, 都是依照成员变量的定义顺序;
2. 什么是初始化列表: 编译期间, C++读取初始化列表, 生成一块静态的存储区域, 简单的说, 作为类的Static成员放置;
new 一个对象的时候, 我们如果执行this.m_变量赋值, 显然要随机执行内存访问, 这样不是C++程序员想看到的, (低效, 我要你干啥);
反过来, 如果是初始化列表的执行是一个MemCpy(this, 初始化里表, sizeof());就能带来性能上的提升;
所以为了使得初始化列表能执行高效, C++编译器先将初始化列表在编译期写入到指定的内存, 然后构造的时候在MemCpy出来.
MemCpy操作前提是连续的内存, 因此初始化列表严格执行"依据类定义的顺序";
3. 子类的构造是分成两部分的:
先构造Base, 然后再构造(Derive - Base), 考虑到在(Derive - Base)构造之前, 要执行初始化列表,
而如果Derive企图初始化Base中的指定成员, 必定会导致内存上的不连续, 从而破坏了MemCpy优化.
所以编译器为了效率不支持"子类初始化列表中初时化基类成员".
- C++编译期系列
- C++编译期系列
- C 使用宏 编译期 二进制表示
- C语言的编译期行为(前言)
- C语言的编译期行为(三) #的妙用
- (C++)使用模板在编译期计算阶乘
- 编译期与运行期
- 编译期与运行期
- 编译期内存分配
- 编译期assert函数
- 编译期的优化
- 编译期断言测试
- Java编译期常量
- 编译期使用MAVEN
- 编译期三角函数计算
- 编译期常量
- java 编译期常量
- 编译期优化
- 9月28日"GG即时通讯软件"
- 系统启动时报错SHDOCVW.DLL找不到的解决办法
- 我眼中的女人
- 【求助】9月30号 深圳到杭州火车票:1张
- C++编译期系列
- C++编译期系列
- love can't wait(music)
- C++指针的新需求
- 高薪和我
- 这个flex做的网站的超酷效果令人大开眼界
- 学西html制作
- asp.net获取本机计算机名和IP
- FCKeditor 2.0 的设置.修改.使用
- 非言非语1号