C++编译期系列<成员变量初始化列表>
构造函数中的初始化列表的内存预设值;
说到初时化列表, 大家都会从<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优化.
所以编译器为了效率不支持"子类初始化列表中初时化基类成员".