c语言编译器:C++编译期系列



构造化列表内存预设值;
说到初时化列表, 大家都会从<C Primer>上面发现这两句话:
1. 效率更高;
2. 化列表初时化顺序依据类定义顺序, 而不是依据化列表中先后顺序;
在<inside C object model>中还会发现:
3. 子类是无法在自己化列表中化基类成员;

为什么高效? 为什么要保持顺序? 为什么不能化基类成员?
1. C标准: 个对象, 它内存结构是: (同个访问级别内)依照成员变量定义顺序;
其实所有C编译器, 都是依照成员变量定义顺序;

2. 什么是化列表: 编译期间, C读取化列表, 生成块静态存储区域, 简单说, 作为类Static成员放置;
个对象时候, 我们如果执行this.m_变量赋值, 显然要随机执行内存访问, 这样不是C员想看到, (低效, 我要你干啥);
反过来, 如果是化列表执行是个MemCpy(this, 化里表, );就能带来性能上提升;
所以为了使得化列表能执行高效, C编译器先将化列表在编译期写入到指定内存, 然后构造时候在MemCpy出来.
MemCpy操作前提是连续内存, 因此化列表严格执行"依据类定义顺序";

3. 子类构造是分成两部分:
先构造Base, 然后再构造(Derive - Base), 考虑到在(Derive - Base)构造的前, 要执行化列表,
而如果Derive企图化Base中指定成员, 必定会导致内存上不连续, 从而破坏了MemCpy优化.
所以编译器为了效率不支持"子类化列表中初时化基类成员".
Tags:  c语言编译 c语言编译软件 c编译器 c语言编译器

延伸阅读

最新评论

发表评论