牛骨文教育服务平台(让学习变的简单)
博文笔记

sizeof计算结构体大小(字节对齐)

创建时间:2016-04-03 投稿人: 浏览次数:1934

引言:sizeof计算结构体的大小经常出现在笔试题中,接下来是对它的一些总结

1.计算结构体大小的准则

  • 数据类型 32位机大小(字节) 64位机大小(字节)
    char 1 1
    short 2 2
    int 4 4
    long 4 8
    指针类型 4 8
    double 8 8
    float 4 4
    unsigned int 4 4
    long long 8 8
  • #pragma pack(n)可以指定对齐值为n(n取1,2,4,8,16)
  • 结构体每个变量的 自身对齐移值 = 自身字节大小
  • 有效对齐值 = min(自身对齐值,指定对齐值)
  • 结构体的自身对齐值为其变量的最大自身对齐值;有效对齐值 = min(自身对齐值,指定对齐值)
  • 结构体每个变量相对结构体首地址的偏移量必须是其有效对齐值的整数倍,否则需要后移直到偏移量为有效对齐值整数倍
  • 结构体大小为最后一个变量偏移量+最后一个变量大小+补充字节数(之所以要有补充字节数是因为结构体大小需要时有效对齐值得整数倍)
  • 空结构体大小为1

2.例子

#pragma pack(8)
struct s1{
    short a;
    long b;
};
struct s2{
    char c;
    s1 d;
    long long e;
};
//求sizeof(s2)的值?(32位机)

解:
1. 先看s1,a的有效对齐值为min(2,8)=2,偏移量为0,0%2=0,符合;b的有效对齐值为min(4,8)=4,偏移量本该是0+2=2,但是2%4!=0,所以其偏移量变成4;结构体大小为b的偏移量+b的字节数=4+4=8,结构体s1的有效对齐值为min(4,8)=4,因为8%4=0,所以不需要加补充字节数
2. 再看s2,c的有效对齐值为min(1,8)=1,偏移量为0,0%1=0,符合;d得有效对齐值为上面计算的8,d的偏移量本该是0+1=1,但是1%4!=0,所以d偏移量变成4;e的有效对齐值为min(8,8)=8,e的偏移量本该是d的偏移量加上其大小,为4+8=12,但是12%8!=0,所以e得偏移量为16;s2的大小为16+8=24,因为s2的有效对齐值为min(8,8)=8,24%8=0,所以不需要加补充字节数,s2大小为24

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。