随笔 - 631,  文章 - 0,  评论 - 84,  阅读 - 225万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

结构体计算要遵循字节对齐原则

结构体默认的字节对齐一般满足三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)

其实 暂且不管这三原则,我的方法只要记住第三个,就是结构体大小结果要为成员中最大字节的整数倍

先看下面定义的两个结构体.

struct {   char a;   short b;   char c; }S1;

struct {  char  a;  char  b;  short c; }S2;

分别用程序测试得出sizeof(S1)=6 , sizeof(S2)=4

注意 为什么 仅仅改变了结构体成员的顺序,结果不一样?

解:

 

(1)首先找出成员变量中最大的字节,可见对于S1和S2 最大是short ,占2个字节,

  (2)所以以后都已2个字节为准,也就是说最多只要2个字节,其他填充占位,注意下图一个格子表示一个字节,

    (3)所以先画2个格子,以后看成员顺序,逐次增加,每次一2为增加基准

    对于S1 ,来说,顺序是 char->short->char      

2个字节
第一个char占一个字节     多的这一个补0,只是占位作用
short 刚好占2个字节  
第二个char也占1个 多的这一个补0

 

所以对于S1结构体大小为 2*3=6,至于为什么第二个char,多的那个字节不丢到,就是遵循第三个原则,就是结构体大小结果要为成员中最大字节的整数倍

对于S2 嘛,也画个图,但是顺序是 char->char->short

 

第一个char占一个字节 第二个char占一个字节
short 刚好占2个字节  

S2=2*2=4

 

按照这个方法再看这样的一个结构体:

struct stu1
         {
               int i;
                             char c;
               int j;
         };

很明显:最大字节为4个。顺序int  char int

 

stu1
int int int int
char 0 0 0
第二个int int int int

因为 int占4个,而char已经咱了一个,不够,所以那三个只能多余占位

Stu1=3*4=12

那么换一下呢?

struct stu2
         {
               int i;
                           
               int j;

            char  c;
         };

Stu2=3*4=12;

再看一个:就是当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行

 

typedef struct A
{
char a1;
short int a2;
  int a3;
  double d;

};

A=16

typedef struct B
{
long int b2;
short int b1;
A a;

};

而对于B,先不要管A a,也就是先去掉A a 成员结构体B 算得 其为8,所以最后结果为8+16=24;24才是最后结果

 

 

 

 

posted on   微笑点燃希望  阅读(1488)  评论(1编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
font=white
点击右上角即可分享
微信分享提示