天梯网站建设,社交博客网站开发,网站栏目内容,专业集团网站建设内存分区
内存全局数据区#xff0c;代码区#xff0c;栈区#xff0c;堆区。
定义一个类 类的成员函数被放在代码区 类的静态成员变量被放在全局数据区#xff08;不占用类的存储空间#xff09; 非静态成员在类的实例内#xff0c;实例在栈区或者堆区 虚函数指针代码区栈区堆区。
定义一个类 类的成员函数被放在代码区 类的静态成员变量被放在全局数据区不占用类的存储空间 非静态成员在类的实例内实例在栈区或者堆区 虚函数指针虚基类指针在类的实例内实例在堆区或者栈区 内存布局实例
普通类不携带静态成员也没有继承关系 class A1
{
public:void func1() {};
public:int a1;char a2;char a3;
};class A2
{
public:void func2() {};
public:char a1;int a2;char a3;
};class A1 size(8): ±– 0 | a1 4 | a2 5 | a3 | (size2) ±– class A2 size(12): ±– 0 | a1 | (size3) 4 | a2 8 | a3 | (size3) ±– A1类携带3个成员变量及1个成员函数成员函数不占用内存在x86平台下整型变量a1占用4个字节字符型变量a2占用一个字节a3占用一个字节, 总共占用内存为 8 字节。因为内存是4字节对齐的2个字符变量占用2字节被补齐为4字节。 A2类携带和A1类相同的变量只不过调整了下顺序第1个为字符变量占用1个字节补齐为4字节第2个为整型变量占用4字节第3个为字符变量占用1字节补齐为4字节 类携带静态成员变量 class B
{
public:void func1();
public:static int b1;int b2;
};该类的类名为B。用简图表示该类内存布局 class B size(4): ±– 0 | b2 ±– B类携带静态整型成员变量b1和整型变量b2静态整型变量b1不占用类的内存整型变量占用4字节的内存因而B类占用内存为4字节。 类携带虚函数并继承 class C1
{
public:void func1();virtual void func2();
public:int a1;
};class C2 : public C1
{
public:void func2() override;
};class C3
{
public:virtual void func1();virtual void func2();
public:int a1;
};class C1 size(8): ±– 0 | {vfptr} 4 | a1 ±– C1::$vftable: | C1_meta | 0 0 | C1::func2 C1::func2 this adjustor: 0 class C2 size(8): ±– 0 | ±-- (base class C1) 0 | | {vfptr} 4 | | a1 | ±– ±– C2::$vftable: | C2_meta | 0 0 | C2::func2 C2::func2 this adjustor: 0 class C3 size(8): ±– 0 | {vfptr} 4 | a1 ±– C3::$vftable: | C3_meta | 0 0 | C3::func1 1 | C3::func2 C3::func1 this adjustor: 0 C3::func2 this adjustor: 0 类C1携带整型成员变量a1占用4字节内存普通成员函数func1虚成员函数func2一旦一个类对象携带虚函数则该类有一个虚函数指针在x86平台下该指针的大小为4字节故而类C1的大小为8字节。虚函数指针指向一个虚函数表是一个数组类C1中有多少个虚函数虚函数表中就有多少个虚函数数组中就有多少个虚函数按照定义虚函数的顺序进行排列 类C2继承类C1虚函数func2继承于类C1C2的虚函数表的第1个元素即为C2:func2 类C3携带2个虚函数虚函数表中有2个元素第1个元素为C3:func1 第2个元素为C3:func2 类携带虚函数并多继承 class D1
{
public:virtual void func1();
};class D2
{
public:virtual void func2();
};class D3 : public D1, D2
{
};class D1 size(4): ±– 0 | {vfptr} ±– D1::$vftable: | D1_meta | 0 0 | D1::func1 D1::func1 this adjustor: 0 class D2 size(4): ±– 0 | {vfptr} ±– D2::$vftable: | D2_meta | 0 0 | D2::func2 D2::func2 this adjustor: 0 class D3 size(8): ±– 0 | ±-- (base class D1) 0 | | {vfptr} | ±– 4 | ±-- (base class D2) 4 | | {vfptr} | ±– ±– D3::KaTeX parse error: Expected EOF, got at position 17: …ftableD1: | ̲D3_meta | 0 0…vftableD2: | -4 0 | D2::func2 类D3继承D1和D2D3中含有2个虚函数指针占用大小为8字节虚函数指针1指向D1的虚函数表虚函数D2指向D2的虚函数表。这部分可能理解有误如有错误希望帮忙指出