C语言是自对齐的,32位以4字节对齐,64位以8字节对齐(1字节=8 bits)

自对齐的好处:在一条指令内完成数据的取或者存的操作,使得内存访问更快;否则,如果一个变量跨机器字存储,那么要做两次或更多次的访问(先取存在前一个机器字的内容,再取存在后一个机器字的内容)。

对齐要求

  • 字符可以起始于任何字节地址
  • 2字节的short int必须起始于偶数地址
  • 4字节的int或者float必须起始于被4整除的地址
  • 8字节的long int或者double必须起始于被8整除的地址
  • struct按照最宽成员进行指针对齐。如果struct中嵌套struct,外部struct要按照自己与内部struct中最宽的成员进行对齐。

内存中的实际存储情况

例1:代码

char *p;
char c;
int x;

内存中的存储

char *p; //4 bytes(32位)或8 bytes(64位)
char c; //1 byte
char pad[3]; //3 bytes,无用空间,老派术语称之为slop(水坑)
int x; // 4 bytes

消除水坑

可以通过改变变量声明的位置挤掉水坑。

水坑发生于大数据类型的存储区域紧跟在一个较小的数据类型的存储区域之后。

消除水坑的方法是按对齐的降序来对变量进行声明。

转载于:https://www.cnblogs.com/qionglouyuyu/p/4969260.html

自对齐(self-aligned)相关推荐

  1. 单片机(MCU)如何才能不死机之对齐访问(Aligned Access)

    从一个结构体说起.如下,在 STM32F0 的程序中,我们定义了一个结构体My_Struct ,那么这个结构体占用多少内存呢? struct Struct_Def { uint8_t Var_B; u ...

  2. aligned内存对齐

    __attribute__((aligned(n)))内存对齐 使用环境Linux version 4.15.0-29-generic (buildd@lgw01-amd64-057) (gcc ve ...

  3. nginx源码分析--内存对齐处理

    1.nginx内存对齐主要是做2件事情: 1) 内存池的内存地址对齐: 2) 长度按照2的幂取整.因为前面结构体已经是对齐了,如果后面的内存池每一小块不是2的幂,那么后面的就不能对齐 2.通用内存对齐 ...

  4. Nginx源码分析--数据对齐posix_memalign和memalign函数

    posix_memalign函数() /*  * 背景:  *      1)POSIX 1003.1d  *      2)POSIX 标明了通过malloc( ), calloc( ), 和 re ...

  5. 整数边界对齐方式_嵌入式基础——字节对齐

    字节对齐 一.内存访问对齐规则 从高级语言的视角看,内存访问是是字节为单位的. 但是从CPU角度看,内存访问粒度与指令有关,比如1字节访问,2字节访问,4字节访问,8字节访问等. 如果在编程过程中不注 ...

  6. 内存对齐/字节对齐/数据对齐/地址总线对齐

    其实是使用InitializeAcl()时发现有个aligned,可我不知道什么是aligned 于是乎我就先搜索了对齐,结果发现了一大堆,什么[字节对齐].[内存对齐].[地址总线 对齐].[数据对 ...

  7. 格式化输出--对齐及补全

    转载自https://www.cnblogs.com/qinchao0317/p/10699717.html 左中右对齐及位数补全 (1)< (默认)左对齐.> 右对齐.^ 中间对齐.= ...

  8. (转载)ARM的字对齐问题总结

    ARM的字对齐问题总结  转载-----http://www.cnblogs.com/yin-jingyu/archive/2011/10/14/2211252.html 一.啥是字对齐?为啥要字对齐 ...

  9. python第一行左对齐_python 左对齐,右对齐

    python 左对齐,右对齐 >>> print('{} and {}'.format('hello','world')) # 默认左对齐 hello and world >& ...

  10. markdown左对齐

    在需要左对齐的部分前后加上一些东西,每行最前面加上&即可. 若要等式对齐,则将&放在等号前面.要按哪个字符对齐,就将&放在哪个字符后面. $$ \begin{aligned} ...

最新文章

  1. AI企业下一个使命:让生物特征数据使用走向阳光透明
  2. Eclipse 报java.lang.OutOfMemoryError: PermGen space
  3. AI:一个20年程序猿的学习资料大全—结构分析软件/办公软件/电气制造控制/高级语言编程/平面三维设计/视频编辑/FQ格式转换软件——只有你不想要的,没有你找不到的
  4. Project Euler Problem 9-Special Pythagorean triplet
  5. 负数在计算机怎样表示与存储
  6. Error: Module “xxx“ does not exist in container. / antd pro v5启用qiankun报错 / 同时使用mfsu和qiankun报错
  7. python完成‘21点游戏’
  8. UVa11549计算器谜题[floyd判圈]
  9. 基于dijsktra算法的最短路径求解_基于dijkstra算法的AGV路径规划(含C++代码)
  10. 矩阵L2,1范数及矩阵L2,p范数的求导
  11. springboot/vue 前后端分离项目搭建流程
  12. arm板上sqlite3移植及使用
  13. 钢铁行业经销商商城系统:完善钢材管控方案,轻松实现控价和防伪
  14. 《Python自然语言处理-雅兰·萨纳卡(Jalaj Thanaki)》学习笔记:05 特征工程和NLP算法
  15. 机器人产业化给导电环行业带来的机遇
  16. Python3群聊聊天室
  17. Spring Bean作用域与生命周期
  18. javaScript关系运算符总结
  19. 电子专业如何写毕业论文
  20. vscode怎么禁用插件_VSCode常用插件用户设置常见冲突解决

热门文章

  1. 数据结构——线性表之链式存储结构
  2. 利用stub技术进行单元测试
  3. Android 中 Behavior, NestedScrollingParent, NestedScrollingChild 关系
  4. 二、Windows下TortoiseGit的安装与配置
  5. python selenium 测试浏览器(IE,FF,Chrome)
  6. 安全与隐私没有允许任何来源选项
  7. CNCF 宣布 Helm 成为基金会下一个重点孵化项目
  8. 洛谷——P1102 A-B数对
  9. 洛谷1373 小a和uim之大逃离
  10. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——3.3 小结...