结构体大小的计算

结构体的大小不是简单地将所有成员大小相加,而是要考虑地址对齐。每个成员的偏移量是其自身大小的倍数,结构体大小则是最大成员大小的倍数。首个成员的偏移量为0。
摘要由CSDN通过智能技术生成

结构体中的成员可以是不同的数据类型,成员按照定义时的顺序依次存储在连续的内存空间。和数组不一样的是,结构体的大小不是所有成员大小简单的相加,需要考虑到系统在存储结构体变量时的地址对齐问题。

首先需要知道偏移量的定义,结构体变量中成员的地址和结构体变量地址的差值。结构体大小等于最后一个成员的偏移量加上最后一个成员的大小。显然,结构体变量中第一个成员的地址就是结构体变量的首地址,因此,第一个成员的偏移量为0。

计算结构体大小的规则:

  1. 每一个成员的偏移量都必须是该成员的倍数。
  2. 结构体的大小必须是该结构体字节数最大成员的倍数。
struct A{
    char a;
};
sizeof(A) 大小是1;计算方法0(偏移量)+1(变量的大小);

struct A{
    char a;
    int b;
};
sizeof(A) = 8;

变量 偏移量 变量大小
a    0       1
b    1+3     4

struct A{
    char a;
    int b;
    virtual fun(){}
};
sizeof(A) = 12

变量 偏移量 变量大小
vfptr 0      4
a    4       1
b    5+3     4


struct A{
    char a;
    int b;
    void function(){}
};
sizeof(A) = 8;

变量 偏移量 变量大小
a    0       1
b    1+3     4

struct A{
    char* a;
    char b;
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值