先了解4个基本概念:

1、数据类型自身对齐值:即数据类型的大小(数组取数组成员类型的自身对齐值),如char的自身对齐值是1,short是2,int、float、double都是4,单位字节

2、结构体的自身对齐值:结构体成员中自身对齐值最大的那个值

3、指定对齐值:使用#pragma pack (value)时指定的对齐值alue

4、有效对齐值:自身对齐值和指定对齐值中较小的那个值

其次,数据存放必须满足以下两个法则:

法则1:有效对齐值为N的数据在内存中存放的起始地址必须是N的整数倍,即满足“存放起始地址 # N = 0”

法则2:结构体的变量占用的总长度必须是结构体有效对齐值的整数倍

有了以上基础,就能判断一个结构体占用内存的空间大小,下面举几个例子分析:

struct B

{

char b;

int a;

short c;

}

假设B从0x0000开始存放,并且默认编译环境默认的指定对齐值是4。第一个成员变量b的自身对齐值是1,比指定对齐值4小,所以有效对齐值是1,所以存放在0x0000空间。第二个成员a的自身对齐值是4,指定对齐值亦是4,所以有效对齐值是4,其存放起始气质必须是4的整数倍,所以必须存放在0x0004~0x0007空间。第三个成员c的自身对齐值是2,比指定对齐值4小,所以有效对齐值是2,紧接a占用空间的下一个起始地址0x0008满足2的整数倍,所以存放在0x0008~0x0009空间。最后,B的自身对齐值是具有最大自身对齐值的成员变量a的自身对齐值4,等于指定对齐值4,所以B总共占用0x0000~0x0011空间。

#pragma pack (2);

struct C

{

char b:

int a;

short c:

};

虽然结构体C的成员组成和结构体B的成员完全一致,但由于定义结构体前指定了对齐值为2,所以所有自身对齐值大于2的成员变量的有效对齐值都变成了2,而且结构体的最终有效对齐值也变成了2,所以占用空间比B小,如下图:

对于联合union,遵循的原则也是一样的,只不过union最终的长度是仅按照占用空间最大的那个成员来计算的,如

union   D{

char   a;   //自身对齐值1

int   b[5];    //自身对齐值4,占用空间最大为5×4 = 20

double   c;  //自身对齐值8

int   d[3];   //自身对齐值4

};

按占用空间最大的成员长度计算,该union初步的长度的20字节,而所有成员中自身对齐值最大的是c,为8,所以该union长度要圆整到8的整数倍,即最终长度是24字节

在编程的时候,为减少中间的填补空间,基本原则是把结构体中的变量按照自身对齐值从小到大排列

c语言四字节对齐,C语言字节对齐详解相关推荐

  1. C语言0长度数组(可变数组/柔性数组)详解

    CSDN GitHub C语言0长度数组(可变数组/柔性数组)详解 AderXCoding/language/c/zero_length_array 本作品采用知识共享署名-非商业性使用-相同方式共享 ...

  2. C语言中的字符串转数字函数常见问题详解

    目录 C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 字符串转长整形 strtol函数, C语言中的字符串转数字函数常见问题详解 字符串转整形 atoi函数 函数原型: int a ...

  3. java注解式开发_JAVA语言之Spring MVC注解式开发使用详解[Java代码]

    本文主要向大家介绍了JAVA语言的Spring MVC注解式开发使用详解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. MVC注解式开发即处理器基于注解的类开发, 对于每一个定义的处 ...

  4. time库是python中处理时间的标准库_python语言time库和datetime库基本使用详解

    今天是边复习边创作博客的第三天,我今年大二,我们专业开的有这门课程,因为喜欢所以更加认真学习,本以为没人看呢,看了后台浏览量让我更加认真创作,这篇博客花了2个半小时的时间,结合自己所学,所思,所想写作 ...

  5. R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置、置信区间、坐标轴(刻度、标签、范围)、无效线去除、水平线、辅助线、box形状、色彩等

    R语言基于forestplot包可视化森林图实战详解:美化的森林图:自定义字体设置.置信区间.坐标轴(刻度.标签.范围).无效线去除.水平线.辅助线.box形状.色彩等 目录

  6. R语言中如何计算C-Statistics?几种计算方法详解

    R语言中如何计算C-Statistics?几种计算方法详解 目录 R语言中如何计算C-Statistics? #包导入 #数据加载编码

  7. 区块链用哪种语言 Java_区块链开发用什么语言呢?区块链与编程语言的关系详解...

    原标题:区块链开发用什么语言呢?区块链与编程语言的关系详解 区块链的概念就随着比特币的大热开始逐渐进入公众视野,比特币的拥有者为了使其创造更高的财富,开始疯狂炒作,因而引发购买比特币大浪潮.然而等到比 ...

  8. c语言中getenv的作用,C语言putenv()函数和getenv()函数的使用详解

    C语言putenv()函数和getenv()函数的使用详解 C语言putenv()函数:改变或增加环境变量头文件: #include4 定义函数: int putenv(const char * st ...

  9. 四旋翼飞行器9——APM地面站使用详解(校准结束)

    四旋翼飞行器9--APM地面站使用详解 如果你手上有一块apm飞控,那么APM飞控第一步--下载APM地面站,校准传感器.遥控器. 下面的文章,大部分参考这个: http://bbs.loveuav. ...

  10. Hadoop入门(四)——模板虚拟机环境准备(图文详解步骤2021)

    Hadoop入门(四)--模板虚拟机环境准备(图文详解步骤2021) 系列文章传送门 这个系列文章传送门: Hadoop入门(一)--CentOS7下载+VM上安装(手动分区)图文步骤详解(2021) ...

最新文章

  1. android view设置按钮颜色_Android 主题换肤技术方案分析
  2. 开发可统计单词个数的Android驱动程序(2)
  3. Objective-C Runtime
  4. 判断均匀平面波的极化形式_测瑞通|怎样判断电波暗室的性能?
  5. Mini T-block——数据中心界的U盘
  6. 手动标记用例状态_【自动化接口用例】从 1 到 1000 过程中的实践和思考
  7. Linux磁盘管理--RAID原理
  8. 安卓开发笔记——探索EventBus(转)
  9. 因为计算机丢失user32.dll,user32dll丢失程序打不开|Win7系统开机提示Uxtheme.dll丢失如何解决?...
  10. UGNX1957安装说明视频教程
  11. 如何装计算机网络驱动,网卡驱动怎么安装,手把手教你电脑网卡驱动怎么安装...
  12. 使用ls筛选某一天的文件
  13. android常用api大全,Android开发个人总结常用的api
  14. 禹司凤扛鸿蒙炉,琉璃美人煞12人物结局,司凤 璇玑完满,柏麟 副宫主结局大快人心...
  15. ActiveMQ(二)
  16. 可汗学院金融学笔记系列
  17. Java程序员面试题集(131-135)
  18. 怎么判断冠词用a还是an_不定冠词a和an有哪些用法
  19. 轻松上手写作利器 Markdown:从此文章排版无烦恼
  20. 读赵凯华之《新概念物理教程.光学》

热门文章

  1. 大气化学实验卫星 ACE-FTS(SCISAT) 相关介绍
  2. html5谷歌地图,谷歌地图API和HTML 5
  3. FileZilla的下载与安装
  4. zabbix最新数据中,没有值 45653:20211111:181222.474 [Z3005] query failed: [1526] Unknown error 1526 [insert in
  5. oracle10g rac ocssd,求教:安装oracle10g rac 报crs-0223错误问题
  6. 安装驱动显卡重启计算机,Win7电脑安装显卡驱动后一直重启的解决方法
  7. stm32定时器从模式解析
  8. 2018计算机中文期刊影响因子排名,2018年最新影响因子:839种5分以上期刊名录
  9. 已更新 联通 电信 tiny模式
  10. js中文汉字转拼音详细教程