C++对象模型探索---第2章对象---类对象所占用的空间

1. 类对象所占用的空间大小

case1:空类中,类对象占用一个字节
#include <iostream>
using namespace std;

class Person
{
public:

};

int main()
{
    Person p1;
    int size = sizeof(p1);   //sizeof(p1) = 1, 空类对象p1存在首地址,占用一个字节
    cout << size << endl;
}
case2: 类中的成员函数不占用类对象的内存空间
#include <iostream>
using namespace std;

class Person
{
public:
    static void func(){} //静态成员函数
    void func2(){} //非静态成员函数
    void func3(){}
};

int main()
{
    Person p1;
    int size = sizeof(p1);   //sizeof(p1) = 1, 类的成员函数不占用类对象的内存空间
    cout << size << endl;
}

case3: 类中的静态成员变量不占用类对象的内存空间
#include <iostream>
using namespace std;

class Person
{
public:
    static int a;
};

int main()
{
    Person p1;
    int size = sizeof(p1);   //sizeof(p1) = 1,静态成员变量不占用类对象的存储空间
    cout << size << endl;
}

case4: 类中的非静态成员变量占用类对象的内存空间
#include <iostream>
using namespace std;

class Person
{
public:
    char c;
};

int main()
{
    Person p1;
    int size = sizeof(p1);   //sizeof(p1) = 1,char类型变量占用类对象的一个字节
    cout << size << endl;
    p1.c = 'c';    //执行到该步,p1地址上的值由0变为63(十六进制),即99(十进制) = 'c'的值,证明成员变量c占用了类对象的内存
}

#include <iostream>
using namespace std;

class Person
{
public:
    int a;
};

int main()
{
    Person p1;
    int size = sizeof(p1);   //sizeof(p1) = 4,int类型变量占用类对象的4个字节
    cout << size << endl;
    p1.a = 12;    //执行到该步,p1地址上的值由0变为c(十六进制),即12(十进制),证明成员变量a占用了类对象的内存
}
case5: 类中有多个数据成员时,为了提高访问效率,有些编译器会将成员间的内存占用比例进行调整(内存字节对齐)
#include <iostream>
using namespace std;

class Person
{
public:
    char a;
    int b;
};

int main()
{
    Person p1;
    int size = sizeof(p1);   //sizeof(p1) = 8, 
    cout << size << endl;
}
case6: 类中的指针变量均占用类对象内存空间的4(Windows)或8个字节(Linux)#####
#include <iostream>
using namespace std;

class Person
{
public:
    char* a;
    int* b;
    double* c;
};

int main()
{
    Person p1;
    int size = sizeof(p1);   //sizeof(p1) = 24, 不管什么类型的指针,其占用类对象的内存空间是固定的,每个指针占4(Windows)或8(Linux)个字节
    cout << size << endl;
}
case7: 类中存在虚函数,无论几个,均占类对象的一个指针字节大小,[4(Windows)或8个字节(Linux)]
#include <iostream>
using namespace std;

class Person
{
public:
    virtual void func1(){}
    virtual void func2(){}
    virtual void func3(){}
};

int main()
{
    Person p1;
    int size = sizeof(p1);   //sizeof(p1) = 8,类中存在虚函数,无论几个,均占类对象的一个指针字节大小(linux=8,windows=4)
    cout << size << endl;
}

结论:

  1. 一个类对象至少占用1个字节的内存空间。
  2. 成员函数不占用类对象的内存空间。
  3. 静态成员变量不占用类对象的内存空间。(静态成员变量和类对象无关,其不保存在类对象内部,保存在对象外面,因而不占用类对象的内存空间)
  4. 非静态成员变量占用类对象的内存空间。(非静态成员变量保存在对象内部,占用类对象的内存空间)
  5. 成员函数无论静态非静态,全部保存在类对象外,不占用类对象的内存空间.
  6. 虚函数不保存在类对象中,但是虚函数会占用类对象的一个指针字节以容纳虚函数表指针(vptr).
  7. 虚函数表[vtbl]是基于类的,跟着类走,与类对象无关.
    8.类对象大小的组成=类中非静态成员变量所占用的内存和(考虑字节对齐) + 虚函数表指针
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值