C++对象模型探索 / 普通类对象占用的空间

一、空类的大小

#include <iostream>

class A{};

int main()
{
    A obja;

    std::cout << "obja 的地址:" << &obja << std::endl;
    std::cout << "obja 的大小:" << sizeof(obja) <<" B "<< std::endl;
    
    return 0;
}

结果:

obja 的地址:0x7fff69557457
obja 的大小:1 B

解释:

        因为对象 obja 在内存中是存在的,尽管 A 没有任何成员函数以及成员变量。为了表征该 obja 的存在,所以编译器选择了一个最节省空间的方法,就是用 1B 来表示该对象。

二、含有普通成员变量的类对象的大小

#include <iostream>

class A
{
    char c;
    int k;
};

int main()
{
    A obja;

    std::cout << "obja 的大小:" << sizeof(obja) <<" B "<< std::endl;

    return 0;
}

结果:

obja 的大小:8 B 

解释:

        这里面有个内存对齐的原因,所以 obja 对象的大小是 8B 。

三、含有静态成员变量的类对象的大小

#include <iostream>

class A
{
public:
    char c;
    int k;
public:
    static int count;
};

int A::count = 10;

int main()
{
    A obja;

    std::cout << "obja 的大小:" << sizeof(obja) <<" B "<< std::endl;

    return 0;
}

结果:

obja 的大小:8 B 

解释:        

        静态成员变量不占用对象空间,该变量保存在全局变量区。

四、含有成员函数的类对象的大小

#include <iostream>

class A
{
public:
    char c;
    int k;
public:
    void func1(){}
    static void func2(){}
};

int main()
{
    A obja;

    std::cout << "obja 的大小:" << sizeof(obja) <<" B "<< std::endl;

    return 0;
}

 结果:

obja 的大小:8 B 

解释:

        上述测试结果是成员函数(静态和非静态)并不占用对象的空间,因为所有的对象公用一套成员函数的代码,所以若每个对象都存储一套函数代码就太浪费了,所以C++编译器将成员函数的代码放在了内存中的代码区。

五、综述

拓展:

        C++程序内存布局分为 全局数据区(data area)、代码区(code area)、栈区(stack area)、堆区(heap area)。

类别存储位置
类对象栈区 / 堆区
普通成员变量类对象
静态成员变量全局数据区(属于类)
普通成员函数代码区(属于类)
静态成员函数代码区(属于类)

 

(SAW:Game Over!)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值