C++对象内存模型

1 对象成员的分类

成员变量:

  • static变量
  • non-static变量

成员函数:

  • non-static函数
  • static函数
  • virtual函数

影响对象内存大小的主要因素:

  • non-static变量
  • virtual函数
  • 虚继承
  • 内存对齐

2 查看对象内存布局的工具和方法

vs2005及以后版本的编译器提供了/d1 reportSingleClassLayout[类名]编译选项来查看对象完整的内存布局。

vs2015

3 对象内存布局的总结

3.1 单继承 - 无虚函数

class Base {
public:
	int base;
	void basefun();
};

class Derived :public Base {
public:
	int derived;
	void derivedfun();
};

内存布局:

class Derived	size(8):
	+---
 0	| +--- (base class Base)
 0	| | base
	| +---
 4	| derived
	+---

3.2 单继承 - 有虚函数

class Base {
public:
	int base;
	void basefun();
	virtual void vbasefun();
};

class Derived :public Base {
public:
	int derived;
	void vbasefun();
	void derivedfun();
};

内存布局:

class Derived	size(12):
	+---
 0	| +--- (base class Base)
 0	| | {vfptr}
 4	| | base
	| +---
 8	| derived
	+---

3.3 单继承 - 虚继承

class Base {
public:
	int base;
	void basefun();
	virtual void vbasefun();
};

class Derived :virtual public Base {
public:
	int derived;
	void vbasefun();
	void derivedfun();
};

内存布局:

class Derived	size(16):
	+---
 0	| {vbptr}
 4	| derived
	+---
	+--- (virtual base Base)
 8	| {vfptr}
12	| base
	+---

3.4 多继承 - 无虚函数

class Derived1 {
public:
	int derived1;
	void derived1fun();
};

class Derived2 {
public:
	int derived2;
	void derived2fun();
};

class Derived : public Derived1, Derived2 {
public:
	int derived;
	void derivedfun();
};

内存布局:

class Derived	size(12):
	+---
 0	| +--- (base class Derived1)
 0	| | derived1
	| +---
 4	| +--- (base class Derived2)
 4	| | derived2
	| +---
 8	| derived
	+---

3.5 多继承 - 有虚函数

class Derived1 {
public:
	int derived1;
	virtual void vderived1fun();
	void derived1fun();
};

class Derived2 {
public:
	int derived2;
	virtual void vderived2fun();
	void derived2fun();
};

class Derived : public Derived1,public Derived2 {
public:
	int derived;
	void vderived1fun();
	void vderived2fun();
	void derivedfun();
};

内存布局:

class Derived	size(20):
	+---
 0	| +--- (base class Derived1)
 0	| | {vfptr}
 4	| | derived1
	| +---
 8	| +--- (base class Derived2)
 8	| | {vfptr}
12	| | derived2
	| +---
16	| derived
	+---

3.6 多继承 - 虚继承

class Derived1 {
public:
	int derived1;
	virtual void vderived1fun();
	void derived1fun();
};

class Derived2 {
public:
	int derived2;
	virtual void vderived2fun();
	void derived2fun();
};

class Derived : virtual public Derived1, public Derived2 {
public:
	int derived;
	void vderived1fun();
	void vderived2fun();
	void derivedfun();
};

内存布局:

class Derived	size(24):
	+---
 0	| +--- (base class Derived2)
 0	| | {vfptr}
 4	| | derived2
	| +---
 8	| {vbptr}
12	| derived
	+---
	+--- (virtual base Derived1)
16	| {vfptr}
20	| derived1
	+---

3.7 菱形集成 - 抽象类

class Base {
public:
	int base;
	void basefun();
	virtual void vbasefun();
};

class Derived1 :virtual public Base{
public:
	int derived1;
	void vbasefun();
	virtual void vderived1fun();
	void derived1fun();
};

class Derived2 :virtual public Base{
public:
	int derived2;
	void vbasefun();
	virtual void vderived2fun();
	void derived2fun();
};

class Derived : public Derived1, public Derived2 {
public:
	int derived;
	void vbasefun();
	void vderived1fun();
	void vderived2fun();
	void derivedfun();
};

内存布局:

class Derived	size(36):
	+---
 0	| +--- (base class Derived1)
 0	| | {vfptr}
 4	| | {vbptr}
 8	| | derived1
	| +---
12	| +--- (base class Derived2)
12	| | {vfptr}
16	| | {vbptr}
20	| | derived2
	| +---
24	| derived
	+---
	+--- (virtual base Base)
28	| {vfptr}
32	| base
	+---
posted @ 2018-10-18 16:09  IUNI_JM  阅读(26)  评论(0)    收藏  举报