c++ 类的大小计算

本文探讨了C++类的大小计算,包括空类的大小为1个字节的原因,无虚指针的类如何根据内存对齐原则确定大小,有虚指针的类如何增加额外开销,以及在继承时子类大小的变化。通过对不同情况的分析,揭示了类大小计算背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

一个空类的大小是多少? 0个字节还是一个字节?本节分析一个类的大小是多少, 怎么计算。 本节没有涉及类中有静态成员的情况, 后面会单独对静态成员做一个分析, 现在只要知道静态成员变量不在类的内存布局中

环境

实验环境只要能编译运行的都可以, 只有86的环境指针的大小为4字节, 64环境指针大小是8字节。

一个空类的大小

一个空类也是有大小的, 其大小为1个字节。我们可以很简单的完成这个实验

class A{
   }; A a;
cout << sizeof(a); // 1

但是需要明白的是为什么空类的大小是1, 而不是0, 这才是目的。

我们先来考虑如果大小是0. 如果空类实例化的对象的大小为0, 那么我们不管实例化多少个这样的对象都不会占内存, 反过来就是说空类的实例化并没有在内存中实际分配地址哦, 那是不是我们无法用指针指向这样的实例化。 指针无法指向空类实例化就有问题, 所以大小为0就是假命题。

实际上真正的原因是 : 一个空类在编译时会被编译器插入一个char字节的变量, 这只是使得空类在实例化时不同的实例化对象在内存中有独一无二的地址。 反过来可以说char用来标识类的不同实例化

无虚指针的类的大小

一个类有了虚函数也就多了一个虚表, 我们先来分析没有虚函数时类的大小。

class A
{
   
    int i, j;
};
class B
{
   
    char ch;
    int i;
};
class C
{
   
    char ch1, ch2;
    int i;
};
class D
{
   
    char ch1;
    int i;
    char ch2;
};

类A的大小为8, 同样类B, C的大小也为8, 而类D的大小却为12.

在解释上面的例子之前要先明白什么时内存对齐

1. 内存对齐

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值