C++:类占用的字节内存

本文通过四个代码示例详细探讨了C++中类的内存对齐规则,包括空类的大小、成员函数是否占用内存、成员变量的影响等。解释了为何空类大小为1字节,成员函数不占用对象内存,以及不同类型成员变量如何影响对象大小。这些知识对于深入理解C++内存管理和对象布局至关重要。
摘要由CSDN通过智能技术生成

 

//验证 1.内存对齐
/*
#include<iostream>
using namespace std;

class CBase
{
    int a;  //这里的内存对齐和struct对齐很像
    char p; //前面定义了一个int型变量,
    char q; //后面定义一个或两个char型的话,都是占用8字节
};

int main()
{
    CBase class_1;
    cout << sizeof(class_1) << endl;    //输出8字节
    return 0;
}
*/

//验证 2.空类占1字节
/*
#include<iostream>
using namespace std;

class A
{

};

int main()
{
    A class_1;
    cout << (void*)(&class_1) << endl;
    cout << sizeof(class_1) << endl;
    return 0;
}
/*
输出1字节
可以看到一个空类对象的大小1.
一个空类对象的大小是1,为什么不是0?
初学者肯定会很烦恼?类A明明是空类,它的大小应该为0,为什么编译器输出的结果为1呢?
这就是实例化的原因(空类同样被实例化),每个实例在内存中都有一个独一无二的地址,
为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,
这样空类在实例化后在内存中得到了独一无二的地址,所以class_1的大小是1.
*/

//验证 3.成员函数不占用类对象的内存空间
/*
#include<iostream>
using namespace std;

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

int main()
{
    A class_1;
    cout << sizeof(class_1) << endl;
    return 0;
}
/*
虽然我们给类A添加了三个成员函数,但这里输出依然是1字节
说明成员函数不占用类对象的存储空间
*/

//验证 4.成员变量占用类对象的内存空间
/*
#include<iostream>
using namespace std;

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

int main()
{
    A class_1;
    cout << (void*)(&class_1) << endl;  //查看class_1的地址
    cout << sizeof(class_1) << endl;    //依然是占用1字节
    class_1.a = 'c';
    return 0;
}
/*
这里输出仍然是1字节
没有char成员变量的时候,编译器往往会给一个空类隐含的加一个字节
有了一个字节的char型成员变量的话,编译器就不会给类加字节了
但char还是占一个字节,不知道你能不能看明白
*/

//验证 5.int型成员变量占4字节
/*
#include<iostream>
using namespace std;

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

int main()
{
    A class_1;
    cout << (void*)(&class_1) << endl;  //查看class_1的地址
    cout << sizeof(class_1) << endl;    //这时就占用4字节
    class_1.a = 12;
    return 0;
}
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值