C语言结构体字节对齐规则

基本规则

规则1 :结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。

规则2:如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对齐规则仍满足原则1、原则2。

Tips:

  • 结构体A所占的大小为该结构体成员内部最大元素的整数倍,不足补齐。
  • 不是直接将结构体A的成员直接移动到结构体B中

规则3:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

案例解析

例1

typedef struct A{int a;short b;
}A;
/** * 内存对齐规则:* 按最长的类型的长度为最长长度* 4*0 = 0 所以从 0 位置开始放* 2*0 = 0 0位置已经有内容* 2*1 = 2 2位置已经有内容* 2*2 = 4 4位置空,可以存放* short长度 为2 而基准长度为4,因此 需要将剩余的两字节补空* 故 A大小为8字节* a a a a* b b - - */ printf("%d\n",sizeof(A));//8

例2

typedef struct B{double a;short b;int c;
}B;
/** * 最长基准长度为8* 8*0 = 0 放于0位置起的8个字节* 2*0 = 0 此处有内容* ...* 2*4 = 8 此处空闲可以存放 8-10用于存放 short* 4*0 = 0 此处已经有内容* ...* 4*3 = 12 此处可以存放 12-15* a a a a a a a a* b b - - c c c c* 所以B共占用 16字节*/printf("%d\n",sizeof(B));

例3

typedef struct C{short a;double b;int c;
}C;
/** * 最长基准长度为:8* 2*0 = 0 0-1位置用于存放a* 8*0 = 0 此处已有内容* 8*1 = 8 8-16位置用于存放b* 4*0 = 0 此处已有内容* 4*3 = 12 12-16存放c* a a - - - - - -* b b b b b b b b* c c c c - - - -*/
printf("%d\n",sizeof(C)); //24

例4

typedef struct D{int a;double b;
}D;
typedef struct E{short a;int b;D c;
}E;
/** * 当结构体内部嵌套结构体时,以两个结构体内部最长的类型为基准长度* 此处结构体D与E最长的长度为D中的double,因此基准长度为:8* 2 * 0 = 0 0-1位置存放E.a* 4 * 0 = 0 * 4 * 1 = 4 4-7位置存放E.b* 8 + 4 * 0 = 8 8-11位置存放D.a* 8 + 8 * 0 = 8* 8 + 8 * 1 = 16 16-23位置存放D.b*/printf("%d\n",sizeof(E)); //24

C语言结构体字节对齐规则相关推荐

  1. C语言结构体字节对齐

      默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在我们不 ...

  2. 一文了解结构体字节对齐

    结构体字节对齐详解 表述如有不正确的地方,欢迎批评指正. C++/C 常见的基本数据类型: bool short (short int) int long (long int) long long ( ...

  3. c语言结构体的对齐方式,C语言结构体内存的对齐知识详解

    前言 在前面的章节中,我们谈到了C语言中整数以及浮点数的储存 今天,我们来谈一谈一些关于结构体内存的知识. 我们先来看一个例子: struct S1 { char c1; int i; char c2 ...

  4. 结构体字节对齐详解【含实例】

    一.前言 结构体字节对齐属于老生常谈的问题,看似简单,却很容易忘记.而且因为结构体使用的普遍性,使得字节对齐也成为了一个不得不谈的话题. 二.什么是结构体字节对齐 假设现在有一个结构体如下,问你它的一 ...

  5. c/c++下取消结构体字节对齐方法

    c/c++下取消结构体字节对齐方法 在c/c++下编译器会默认地对结构体进行对齐,其对齐的方法跟平台具体的特性有关,本文主要介绍结构体不进行对齐的方法. 1.结构体字节不进行对齐的用途 (1).减小内 ...

  6. 结构体字节对齐(转)

    结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是 ...

  7. 指定结构体字节对齐方式

    指定结构体字节对齐方式 #pragma pack(push,1) typedef struct  { int b; char a;  }struct_t1; #pragma pack(pop)

  8. mysql字节对齐_结构体字节对齐(转)

    结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是 ...

  9. typedef __packed struct (结构体字节对齐)(转)

    结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但 ...

最新文章

  1. 省选前的计划(日更,然而你们天天吊打我)
  2. JAVA 解析xml字符串
  3. 中科大分布式算法教案.pdf
  4. 为什么孙悟空能大闹天宫,却打不过路上的妖怪?
  5. JS Statements var / let / const
  6. 使用telnet命令测试网络时连接建立后无法退出解决办法
  7. dp cf 20190614
  8. ASP.Net中服务器控件的生命周期
  9. asp.net AJAX 使用webServices调用时,出现“WebService”未定义
  10. pytorch分布式报错 “tensor must be non-overlapping and dense“
  11. 项目管理工具_项目管理工具MS Project使用经验分享
  12. ASP.NET2.0缓存(Cache)技术
  13. 10款精美的web前端源码的特效
  14. Map转换List一些方法
  15. 边缘计算是什么,对企业有什么影响?
  16. Xilinx ISE 千兆以太网通信基础
  17. 给计算机写程序的第一人竟是一位女子
  18. 中公教育python教师_中公教育的教师水平怎么样?
  19. python主题更改_IDLE怎么将主题修改成Darcula样式?
  20. android 吧文字读出来,android学习之文字语音朗读

热门文章

  1. 数字化经济时代的企业信息化管理转型——数据化 信息化 数字化 智慧管理的概念及它们之间的关系
  2. html5定义页脚的标签,HTML中footer标签的使用方法
  3. mac-python包安装错误 [Errno 1] Operation not permitted: '/var/folders/5n/vbm997m56xg3kw67y6bccn2m0000gn/T
  4. php怎么给视频加水印,视频怎么加水印 添加文字水印和图片水印 给视频加水印的软件...
  5. Android studio百度地图之定位到国外
  6. C#练习题答案: 字母战争 - 核打击【难度:3级】--景越C#经典编程题库,1000道C#基础练习题等你来挑战
  7. 岁月温柔-10 妈妈的执念--不肯开空调,坚持使用油汀
  8. 史上最全的中高级JAVA工程师-面试题汇总
  9. 周迅是永远的精灵,不接受反驳
  10. 灵 源 大 道 歌 · 曹 文 逸