现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。简单来说就是牺牲空间来增加访问效率。

其准则如下:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

下面来说一说对齐的规则:

例1:

struct test1
{
int ia;   
double da;  

char ca;
};

  sizeof(test1) = 24

让我们看看他们在内存上是如何分布的:

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

ia

ia

ia

ia

da

da

da

da

da

da

da

da

ca

double类型的da首地址必须为8的倍数,编译器在ia和da的中间加4个填充字节,结构体的总大小为8的倍数,编译器在末尾填充7个填充字节。

  例2:

struct test2
{
short sa;
short sb;
double da;

};

sizeof(test2) = 16

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

sa

sa

sb

sb

da

da

da

da

da

da

da

da

ca

short sb的对齐值为2,所以可以在3,4位置上。

那我们如何能按自己的意愿指定对齐值呢?

使用 #pragma pack(n),编译器会按n和结构体中最长的成员的长度中较小者为其值。

使用#pragma pack(2)之后 sizeof(test2) = 12,da的首地址为4。

若想在同一文件中使不同结构体按不同值来对齐,还可使用__attribute__ ((__packed__))来为每一个结构体声明。

参考资料:百度百科http://baike.baidu.com/link?url=0JTcfOdOwII5V0F99OTbJnGXaDd6CtrEXy-tJHja3fQ7GmEhQ-4rVRdhhmjZtnUDyIGb7xOwEMjLf-i_BjEoI6Q5YzkCLIS0Ga1MZMDfExdP1-coCojy74OP7deoTovA

转载于:https://www.cnblogs.com/dk666/p/5969755.html

C/C++字节对齐总结相关推荐

  1. 面试题--特别是字节对齐

    来源:http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html [1]设置或者清除某位. 示例代码如下: 1 #include&l ...

  2. java字节对齐 32 64_【C语言】字节对齐问题(以32位系统为例)

    1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...

  3. (转)C语言字节对齐

    图片可以在下面的博客中看到. 转自:http://blog.csdn.net/bigloomy/article/details/6633008 可能有不少读者会问,字节对齐有必要拿出来单独写一篇博客嘛 ...

  4. 怎么把位域合成一个字节_C语言中字节对齐和位域

    1.1基本类型默认字节对齐和改变字节对齐方式 c语言在给不同类型变量分配地址空间时,并不是总是紧邻着上一个变量的地址空间分配的,而是它所在的地址空间,必须被它的默认对齐字节数整除.例如,int类型占4 ...

  5. android APK内存多少字节,Android apk安全测评、应用加固、字节对齐、二次签名(有这一篇就够了)...

    本文将通过前言.apk安全测评.应用加固.字节对齐.二次签名.总结共6大版块来阐述 一.前言 评判一个App是否出色,除了看它的性能.体验外,本人认为最为重要的是它的安全性.市面上apk安全评测.加固 ...

  6. 面试常考,项目易错,长文详解C/C++中的字节对齐

    作者 | 李肖遥 来源 | 技术让梦想更伟大(ID:TechDreamer) 头图 |  CSDN 下载自东方IC 引入主题,看代码 我们先来看看以下程序 //编译器:https://tool.lu/ ...

  7. C/C++结构体字节对齐详解

    结构体的sizeof 先看一个结构体: struct S1 {     char c;     int i; }; sizeof(S1)在VC6中按默认设置得到的结果为8. 我们先看看sizeof的定 ...

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

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

  9. mysql字节对齐_结构体字节对齐-位域及其对齐

    字节对齐的准则:其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2) 结构体每个成员相对于结构体首地址的偏移量都是成 ...

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

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

最新文章

  1. Android 删除无用的导包
  2. shell的各种运行模式?
  3. Android自定义Layout
  4. 基于BP神经网络+HOG特征提取的视频中车辆车牌识别算法仿真
  5. 计算机更新80072f76,win10系统出现错误代码0x80072f76的解决方法
  6. Kafka 孕育开源 KarelDB
  7. 神奇的计算器dc和bc
  8. 天池 在线编程 最小的行程(动态规划)
  9. chrome+android+浏览器下载图片不显示,chrome谷歌浏览器部分图片不显示怎么办
  10. 微信里文件小程序导不出来_微信里的这5款小程序,果然不一般,黑科技啊!...
  11. python抽奖游戏、某商场为了促销_详解python--模拟轮盘抽奖游戏
  12. 初学unity(简单场景制作)
  13. 我是ASML,除了技术,还有故事
  14. 耿建超英语语法---时态+疑问句
  15. 【Python3.6爬虫学习记录】(十三)在阿里云服务器上运行爬虫
  16. 论文复现:用 CNN 进行文本分类
  17. AI美图相机原型(智能P图、AI换脸)
  18. 北大青鸟 ASP.NET(C#) 视频 全32集
  19. NTC电阻抑制冷机启动浪涌电流
  20. International Classification for Standards 国际标准分类号

热门文章

  1. 响应式网页设计代码_消除响应式网站建设设计中的缺陷
  2. android资源包混淆,Android---andresguard资源混淆
  3. qq第三方登录注册php,QQ第三方登录PHP
  4. php html xml,xml和html之间的区别有哪些
  5. ai去除水印_ai全自动视频剪辑软件,每天批量制作800条原创视频!
  6. oracle实现分段,用Oracle分段空间管理功能改进数据库性能
  7. java常见_Java 常用类
  8. 如何设置mysql的权限_mysql 权限控制
  9. PYG教程【二】使用networkx创建一个PYG图
  10. 6行代码!用Python将PDF转为word