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

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

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才是最后结果

结构体大小的计算 用最简单的方法,通俗易懂的方法计算结构体大小相关推荐

  1. 【转】彻底搞清计算结构体大小和数据对齐原则

    数据对齐: 许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是 某个值K(通常是2,4或8)的倍数.这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件 设计.例如, ...

  2. 【C语言进阶深度学习记录】二十 结构体大小计算与结构体内存布局的详细方法

    结构体大小的计算往往是面试笔试常考的知识.对于简单的结构体,可以一眼看出来,对于复杂的结构体,该如何计算结构体占用内存的大小呢? 本文学习所使用的编译器是gcc 4.4.5 使用其他编译器或者使用Wi ...

  3. (C语言)计算结构体大小——结构体内存对齐

    本篇文章计划用简单的方式向大家介绍如何计算结构体大小这一问题 首先我们必须明确一件事,想要计算结构体大小,就不得不了解结构体内存对齐的规则 一.结构体的对齐规则 1.第一个成员在在与结构体变量为0的地 ...

  4. 结构体大小计算与位域大小计算

    结构体大小计算与位域大小计算 本博文纯属个人理解,有错误请多指正. 首先,各个变量所占的字节: 类型 字节(64位) 字节(32位) char 1 1 unsigned char 1 1 short ...

  5. 结构体大小之嵌套结构体的长度计算

    计算嵌套结构体的长度需要掌握一般结构体的计算方法,这篇文章是我看的中写的不错的,但是他嵌套结构体的计算写的不太好,在他的基础上进行一些改进: https://blog.csdn.net/qq_1932 ...

  6. C语言sizeof结构体大小计算

    一.一般类型 约定为32位系统,即char 1字节.short 2字节.int 4字节,指针是地址4个字节 定义:偏移量 偏移量指的是结构体变量中成员的地址和结构体变量地址的差.结构体大小等于最后一个 ...

  7. Windows下struct和union字节对齐设置以及大小的确定(一 简介和结构体大小的确定)...

    在windows下设置字节对齐大小的方式,目前我了解有三种: 1. 在编译程序时候的编译选项  /Zp[n],如 cl /Zp4 表示对齐大小是4字节: 2. 预处理命令   #pragma pack ...

  8. C语言结构体详解(结构体定义,使用,结构体大小等)

    c语言结构体详解 1.c语言结构体 1.1 结构体基础知识 1.2 结构体声明 1.3 结构体特殊声明 1.4 结构体的自引用 1.5 结构体的大小的计算 1.5.1了解结构体大小计算规则 1.5.2 ...

  9. 结构体大小的计算方法

    结构体大小的计算需同时满足以下几点 一.结构体成员的偏移量必须是当前成员大小的整数倍.(0是任何数的整数倍) 举一个例子 struct Test1{char a; // 当前偏移量为0,是char所占 ...

最新文章

  1. IDEA实用插件和技巧
  2. linux服务器性能监控命令汇总之free命令(四)
  3. java密钥库文件存在但为空_java安全套接层SSL示例
  4. c语言三阶素数魔方阵,用C语言构造3*3素数魔方阵,即找出9个不大于500的素数并排成魔方阵。...
  5. html5和极速模式,浅谈360浏览器6.0版本极速模式与兼容模式_蓝戒的博客
  6. 获取Http请求参数
  7. python爬虫如何连接数据库_Python爬虫框架和数据库连接
  8. 安卓 linux arm go,go arm、android版本
  9. 在WebBrowser控件使用js调用C#方法
  10. CWMP(TR069)协议标准学习
  11. URPF(Unicast Reverse Path Forwarding)反向路径转发
  12. 自我学习35:Log日志分析
  13. 【格蕾读C++ Primer Plus】第九章 内存模型和名称空间
  14. Win10开机黑屏进不了桌面
  15. DaDa英语怎么样,给孩子报名哒哒英语上课好不好?
  16. 一文搞定 JVM 面试,教你吊打面试官~
  17. 1646. Prime Path
  18. 【汇总】 美股开户方法 、 美股开户攻略 、 美股开户流程 、 美股教程
  19. 很久没来,丢一份前阵子做的 10 万连接性能测试 (fibjs, golang, nginx, nodejs)
  20. C语言 while循环和do...while循环

热门文章

  1. 20201117VISIO画半圆
  2. 两个音轨合并_Guitar Pro 7教程之将多音轨合并为一个音轨
  3. CHOOSE函数介绍:
  4. tmux 256 色配置
  5. 干货|面试结束后应该做的5件事
  6. python和excel在一起啦_Python 与 Excel 终于在一起了
  7. 电子工程师怎么才能规范设计标准、提高设计效率?
  8. vue3-tree-org 组织结构图
  9. 7-171 打擂法找最大的数
  10. Access数据库:它已经被别的用户以独占方式打开,操作必须使用一个可更新的查询,不能锁定文件