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优化.
  所以编译器为了效率不支持"子类初始化列表中初时化基类成员".

原创粉丝点击