什么是字节对齐

首先给大家看段对话:

老师:小明,请读一下这本书标题。
小明:《程序员的脱发秘籍》
老师:那请说下当中的第三个字是什么?
小明:“员”
老师:那第17笔是哪个字?
小明:??好吧,我数下。。。是“序”
老师:很好,速度再快点,请问第26笔所在的字与第38笔所在字谁的拼音多?
小明:老师,您对我有意见直说!
……

通过上面的对话咱们可以很明确的感受到,咱们在进行阅读时都是一个字一个的读,而非一笔一笔的读,这个道理放在计算机当中也一样:**计算机并非逐字节大小读写内存,而是以2,4,或8的倍数的字节块来读写内存。**如此一来就会对基本数据类型的合法地址作出一些限制,那么就要求各种数据类型按照一定的规则在空间上排列,这就是对齐。

为什么这么设计

那为什么要这样设计呢?一方面是因为我们的计算机硬件就是这么设计的,也就是说CPU在访问存储器的时候只能在某些地址处获取某些特定类型的数据。另一方面,因为CPU读取数据的时候不是一个一个读的,而是几个几个读的。如果数据不按照一定的规则存储的话,会降低读取速度,从而影响计算效率,如同老师问的第二个问题“第17笔是哪个字?”正常人都没办法一下子说出来。

概念与规则

对齐值

  1. 基本数据类型自身的对齐值为其数据类型所占的内存字节大小,如:int为4。
  2. 结构体或者类的自身对齐值:其成员中自身对齐值最大的那个值。
  3. 指定对齐值:#pragma pack (value)时的指定对齐值value。
  4. 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中小的那个值。

对齐规则

  1. 结构体中,每个成员存储的起始地址必须是该成员(成员可能是结构体,注意对齐值)的对齐值的整数倍。
  2. 在结构体的总大小必须是其中最大的基本数据类型的对齐值,不足的在后面补足。

结构体举例

下面展示一些结构体对齐情况供大家参考(代码后图片为此代码各数据所占字节)
结构体字节对齐情况:

 struct Person//共占用16字节
{int number;//int占4字节 占用的地址:0~3char sex;//char占1字节 占用的地址:4  对齐空出地址4~7double money;//double占8字节 占用的地址:``8~15
};


将结构体内数据类型顺序调换后:

struct Person//共占用24字节
{char sex;//char占1字节 占用的地址:0  因下一个类型需占用8字节故对齐空出地址0~7double money;//double占8字节 占用的地址:8~15int number;//int占4字节 占用的地址:16~19  对齐空出地址20~23
};


指定对齐值后:

#pragma pack(4)//指定对齐值为4
struct Person//共占用16字节
{char sex;//char占1字节 占用的地址:0  因指定对齐值为4字节,故对齐空出地址0~7double money;//double占8字节 占用的地址:4~11int number;//int占4字节 占用的地址:11~15
};

C语言学习笔记:字节对齐相关推荐

  1. c语言如何宏定义枚举型结构体,C语言学习笔记--枚举结构体

    枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...

  2. R语言学习笔记(1~3)

    R语言学习笔记(1~3) 一.R语言介绍 x <- rnorm(5) 创建了一个名为x的向量对象,它包含5个来自标准正态分布的随机偏差. 1.1 注释 由符号#开头. #函数c()以向量的形式输 ...

  3. C语言学习笔记第十天

    C语言学习笔记第十天 目录 C语言学习笔记第十天 一.什么是堆内存 二.为什么要使用堆内存 三.如何使用堆内存 四.malloc的内存管理机制 五.使用堆内存需要注意的问题 六.内存清理函数 七.堆内 ...

  4. (一)Go语言学习笔记

    Go语言学习笔记 1 前言 2 写Go语言需要注意的地方 2.1 Go语言编译执行和直接run的区别 2.2 Go语言的特点 2.3 Linux下配置Go环境变量 2.4 随记 3 go_code 3 ...

  5. C语言学习笔记06-占位符格式、C基本类型及逃逸字符一些细节(附介绍BCD码)

    主要整理有关占位符格式与逃逸字符的一些细节 朋友们,看栗子--"BCD解码" (文末附BCD码介绍) 一个BCD数的十六进制是0x12(对应二进制表示:0001 0010),它表达 ...

  6. 嵌入式C语言——学习笔记

    嵌入式C语言--学习笔记 计算机程序语言的学习思路? GCC的使用及其常用选项介绍 gcc概述 C语言编译过程 C语言常见的错误 预处理的使用 宏展开下的 #.## C语言常用关键字及运算符操作 关键 ...

  7. 梓益C语言学习笔记之链表&动态内存&文件

    梓益C语言学习笔记之链表&动态内存&文件 一.定义: 链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构. 二.特点: 链表由一系列节点(链表中每一个元素称为节点)组 ...

  8. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

  9. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  10. C语言学习笔记-P1 初识C语言(2)

    C语言学习笔记-P1 初识C语言(2) C语言学习笔记-P1 初识C语言(2) 一.常量 1.字面常量 2.const修饰的常变量 3.#define定义的标识符常量 3.枚举常量 二.字符串+转义字 ...

最新文章

  1. Windows server 2008普通用户不能远程登录问题
  2. 为什么升级不了android版本,为啥你的手机无法升级到安卓7.0?原因都在这里!...
  3. Asp.net 操作cookie大全
  4. echo怎么把日志清空_shell脚本清空系统message日志
  5. 使用Powershell批量获取Exchange 2013邮箱用户容量使用量
  6. 单点登录的原理与简单实现
  7. 云网络被广泛应用 企业SaaS选型面临五大安全问题
  8. lbp特征的matlab实现
  9. 计算机网络专业以后装网线,安装了1000M宽带后,您就不必再上网了吗?千兆宽带有多快?...
  10. R语言数据统计1——正态性检验
  11. 深度学习环境搭建之三_离线安装无线网卡、DKMS
  12. 生鲜配送系统开发功能流程 生鲜配送系统源码
  13. java开发操作系统:启动任意多控制台窗口
  14. Linux Github 使用 ssh 登录及推送 - 一站式教程
  15. Emlog程序百度熊掌号一键集成+自动推送插件
  16. Javascript进阶笔记
  17. drawLine(self, Union[QPointF, QPoint], Union[QPointF, QPoint]): argument 1 has unexpected type ‘floa
  18. 赛门铁克公司太不厚道
  19. 游戏开发中的物理介绍
  20. 小米与美的的“初吻”是为了什么

热门文章

  1. 观史图馆之《苏美尔与巴比伦历史地图》与《赫梯历史地图》
  2. 入门必懂:你关心的今日头条推广热点问题来了!
  3. (附源码)计算机毕业设计SSM智慧校园系统
  4. image的srcset属性
  5. 英语日常用语100句
  6. 英雄联盟掉线怎么不显示重新连接服务器,Win7旗舰版系统玩英雄联盟掉线总是显示正在尝试重新连接如何解决...
  7. 今年圣诞节给您的Memoji戴圣诞老人帽子
  8. php使用PhpPresentation生成ppt时,预定义ppt宽度和高度(自定义宽高)
  9. c,c++小白到大神系列教程之一:C语言入门-王健伟-专题视频课程
  10. 统计字符串中英文字母的个数(指针)