结构体大小计算

一些定义:

偏移量: 结构体中的该变量前面占用的字节数
成员变量对齐参数: 结构体中该变量的大小
结构体整体的对齐参数: 结构体中最大的成员变量的对齐参数

计算规则:

  1. 每一个成员的偏移量都必须是该成员的倍数。
  2. 结构体的大小必须是结构体整体的对齐参数的倍数。

例:

#include<iostream>
using namespace std;
struct TestStruct  
{  
    char c;
    int i; 
    short s;    
};   

int main(){
    cout << sizeof(TestStruct);
}
  1. c的偏移量是0,因为前面没有,c的对齐参数是1,因为是char类型,所以到c为止偏移量等于0+1=1
  2. i的偏移量是1,因为前面有c,i的对其参数是4,因为是int类型,但是要满足计算规则1所以要给c后面填充3个字节i从第四个字节开始计算,最终到i为止偏移量对于1+3+4=8
  3. s的偏移量是8,因为前面是c和i,s的对其参数是2,因为是short类型,8是2的整数倍,满足计算规则1,所以到s为止8+2=10
  4. 当所有成员计算完后,要满足计算规则2结构体整体的对齐参数为4,因为int=4,short=2,char=1,取max,10不是4的倍数,最小是12是4的倍数,所以最后结构体大小为 12

一些补充:

  • 对于C++的类大小计算和结构体一致
  • 对于结构体中嵌入结构体来说,视为其展开就行,只需注意一点:展开后的结构体的第一个成员的偏移量应当是被展开的结构体中最大的成员的整数倍,其他不变
  • 对于C++11中支持了自定义对齐参数了:# pragma pack(8) ,每个成员的偏移量只要是8的倍数就行
  • static变量,直接忽略,不计入结构体大小
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值