[C]结构体变量

结构体大小

  • 结构体对齐基准(以下两者最小值
    • 结构体中最宽基本类型;(数组或内嵌结构体相当于展开
    • 预编译指令#pragma pack (n) 手动设置 n-- 只能填 1 2 4 8 16;
  • 结构体的总大小为结构体对齐基准大小的整数倍
  • 按照首地址开始累进,不足对齐基准先和后面组合,<对齐基准则组合,不行,则系统填充
  • 类或结构体的静态成员变量不占用结构体或类的空间,也就是说 sizeof 出来的大小跟静态成员变量的大小无关;
  • 作为成员变量的结构体的偏移量必须是 自己最大成员类型字节长度的整数倍;(不考虑其他成员变量!!)
struct ss0{  
    char a[15]; //占15个字节,从0开始偏移,所以下面的int是从15开始偏移  
    int x;//偏移量 0x15+1=16  
}s1;  
cout<<sizeof(s1)<<endl; //结果为20字节  
  
struct ss1    
{  
    char a[15]; //  
    int x; //偏移量 16字节  
    char b; //偏移量 21字节  
}s2; //结果为21字节,按最大基本类型对齐,补充到24字节  
cout<<sizeof(s2)<<endl; //结果为24字节  
  
struct  ss2  
{  
    char a[15];  
    int x;  //偏移量 16字节  
    double b; //偏移量 24字节  
    char c;//偏移量 32字节  
}s3;//共33字节,按最大基本类型对齐,补充到40字节(整除8)  
cout<<sizeof(s3)<<endl; //结果为40字节  
  
struct  
{  
    char a; //偏移0,1字节  
    struct ss0 b;//偏移1+3=4,20字节  
    char f;//偏移24, 1字节  
    struct ss1 c;//偏移25+3,24字节  
    char g;//偏移52,1字节  
    struct ss2 d;//偏移53+3,40字节  
    char e;//偏移96,1字节  
}s7;//共97字节,不能整除sizeof(double),所以补充到104字节  
cout<<"here:"<<sizeof(s7)<<endl;

reference

1.关于结构体占用空间大小总结

2.三步解决 C 语言中 struct 字节对齐问题

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。