C++对象内存模型
1 对象成员的分类
成员变量:
- static变量
- non-static变量
成员函数:
- non-static函数
- static函数
- virtual函数
影响对象内存大小的主要因素:
- non-static变量
- virtual函数
- 虚继承
- 内存对齐
2 查看对象内存布局的工具和方法
vs2005及以后版本的编译器提供了/d1 reportSingleClassLayout[类名]编译选项来查看对象完整的内存布局。
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
+---