学会从C++ Object Model着手分析(一)

学会从C++ Object Model中着手分析

1.                需要多少内存才能表现一个class object? 一般而言要有

·         nonstatic data members的总和大小;

·         加上任何由于alignment的需求而填补(padding)上去的空间 (可能存在于members之间,也可能存在于集合体边界);

·         加上为了支持virtual而由内部产生的任何额外负担。

 

2.                Nontrivial default constructor产生的条件

(如果class没有明确定义default constructor, 编译器需要为某class合成出nontrivial default constructor. 同时编译器会扩张已存在的constructors, 在其中安插一些必须初始化代码。那么什么时候会需要必需的初始化代码呢?)

·         包含有“拥有Default Constructor”的Member Class Object(必需的初始化代码是调用这些Member Class ObjectDefault Constructor

·         “带有Default Constructor”的Base Class (必需的初始化代码是调用上一层base classesdefault constructor

·         带有一个Virtual Function”Class, 包括class声明(或继承)一个virtual function. (必需的初始化代码是virtual function tablevptr

·         “带有一个Virtual Base Class”的Class (必需的初始化是添加指向virtual base class的指针,以帮助代码执行其对虚基类成员访问时的必要跳转)

 

3.                正如trivial default constructor总是不用你操心,Bitwise Copy Semantics也总是缺生存在,不影响你copy constructcopy assignment operator. 

同样的道理在以下情况(不符合Bitwise Copy Semantics),编译器会特别添加代码。

·         class 内含一个member object而后者的class声明有一个copy constructor时;

·         class继承自一个base class而后者存在有一个copy constructor时;

·         class声明了一个或多个virtual functions时;

·         class派生自一个继承串链,其中有一个或多个virtual base class时。

Note: Trivial or Nontrivial default constructor (copy constructor, copy assignment operator)都是针对于编译器而言。程序员请根据语义的需要决定是否需要自定义explicit  constructor. 例如,当你需要设置data members的初始化值时,当你不希望经过拷贝构造后指针member指向同样的一块内存区域等等。

 

4.                编译器会对initialization list一一处理并可能重新排序,以反映出members的声明次序,它会安插代码到constructor体内,并置于任何explicit user code之前。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值