(C++对象模型):类对象所占用的空间

目录

类对象所占用的空间

visual studio 操作

类对象所占用的空间解析

为什么sizeof(空类)= 1而不是0

类的成员函数 不占用 类对象的内存空间

增加 char 类型的成员变量

增加 int 类型的成员变量

结论


类对象所占用的空间

visual studio 操作

  • F9     设置断点
  • F5      执行调试   运行程序至断点
  • Shift + F5   停止调试
  • Ctrl + F5    执行不调试
  • Shift + F9   快速监视,查看变量内存信息 
    • 在弹出框表达式的变量前加 & 查看地址
  • 查看变量内存(在调试状态下才有该选项)

类对象所占用的空间解析

为什么sizeof(空类)= 1而不是0

  • 代码
class A {
public:
};

int main()
{
    A a;
    int a_len = sizeof(a); //等价于sizeof(A)
    std::cout << a_len << std::endl;  // 输出 1
    return 0;
}
  • 按F5 ,选择对象a,Shift +F9进行查看

  • 将上述对象a地址,复制到内存查询中,如下:

  • 为什么sizeof(空类)= 1而不是0?
    • 即便是一个空类对象,这个类的对象在内存中有起始地址的,这个地址是属于对象a,必然至少要存得下一个字节

类的成员函数 不占用 类对象的内存空间

  • 在空类中加入成员函数:

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

int main()
{
    A a;
    int a_len = sizeof(a); //等价于sizeof(A)
    std::cout << a_len << std::endl;  // 输出 1

    return 0;
}
  • 运行结果依旧是1

增加 char 类型的成员变量

  • 由前面两个案例可知:
    • 成员函数不占用类对象的内存空间
    • 一个类对象至少占用1个字节的内存空间
class A {
public:
    void func1() {};
    void func2() {};
    void func3() {};
    char ac; //成员变量,占一个字节
};

int main()
{
    A a;
    int a_len = sizeof(a); 
    std::cout << a_len << std::endl;  // 输出 1
    a.ac = 'c',

    return 0;
}
  • 输出为 1;
  • 分析:
    • 查看对象a的地址

  • 赋值前

  • 赋值后

  • 结论:成员变量是占用对象的内存空间的

增加 int 类型的成员变量

class A {
public:
    void func1() {};
    void func2() {};
    void func3() {};
    int ac; //成员变量,占4个字节
};

int main()
{
    A a;
    int a_len = sizeof(a); 
    std::cout << a_len << std::endl;  
    a.ac = 'c';

    return 0;
}
  • 分析

  • 赋值后

结论

  • 成员变量是包含在每个对象中的,是占用对象字节的。
  • 成员函数虽然也写在类的定义中,但成员函数不占对象字节数的(不占内存空间)
  • 成员函数 每个类只诞生 一个(跟着类走),而不管你用这个类产生了多少个该类的对象
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值