C/C++字节对齐总结
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。简单来说就是牺牲空间来增加访问效率。
其准则如下:
下面来说一说对齐的规则:
例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++字节对齐总结相关推荐
- 面试题--特别是字节对齐
来源:http://www.cnblogs.com/Braveliu/archive/2013/01/04/2844757.html [1]设置或者清除某位. 示例代码如下: 1 #include&l ...
- java字节对齐 32 64_【C语言】字节对齐问题(以32位系统为例)
1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...
- (转)C语言字节对齐
图片可以在下面的博客中看到. 转自:http://blog.csdn.net/bigloomy/article/details/6633008 可能有不少读者会问,字节对齐有必要拿出来单独写一篇博客嘛 ...
- 怎么把位域合成一个字节_C语言中字节对齐和位域
1.1基本类型默认字节对齐和改变字节对齐方式 c语言在给不同类型变量分配地址空间时,并不是总是紧邻着上一个变量的地址空间分配的,而是它所在的地址空间,必须被它的默认对齐字节数整除.例如,int类型占4 ...
- android APK内存多少字节,Android apk安全测评、应用加固、字节对齐、二次签名(有这一篇就够了)...
本文将通过前言.apk安全测评.应用加固.字节对齐.二次签名.总结共6大版块来阐述 一.前言 评判一个App是否出色,除了看它的性能.体验外,本人认为最为重要的是它的安全性.市面上apk安全评测.加固 ...
- 面试常考,项目易错,长文详解C/C++中的字节对齐
作者 | 李肖遥 来源 | 技术让梦想更伟大(ID:TechDreamer) 头图 | CSDN 下载自东方IC 引入主题,看代码 我们先来看看以下程序 //编译器:https://tool.lu/ ...
- C/C++结构体字节对齐详解
结构体的sizeof 先看一个结构体: struct S1 { char c; int i; }; sizeof(S1)在VC6中按默认设置得到的结果为8. 我们先看看sizeof的定 ...
- 整数边界对齐方式_嵌入式基础——字节对齐
字节对齐 一.内存访问对齐规则 从高级语言的视角看,内存访问是是字节为单位的. 但是从CPU角度看,内存访问粒度与指令有关,比如1字节访问,2字节访问,4字节访问,8字节访问等. 如果在编程过程中不注 ...
- mysql字节对齐_结构体字节对齐-位域及其对齐
字节对齐的准则:其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2) 结构体每个成员相对于结构体首地址的偏移量都是成 ...
- 内存对齐/字节对齐/数据对齐/地址总线对齐
其实是使用InitializeAcl()时发现有个aligned,可我不知道什么是aligned 于是乎我就先搜索了对齐,结果发现了一大堆,什么[字节对齐].[内存对齐].[地址总线 对齐].[数据对 ...
最新文章
- 一条数据的HBase之旅,简明HBase入门教程-Write全流程
- 转:python模块学习 ---- smtplib 邮件发送
- js 中 setInterval 的返回值问题
- 绘制pr曲线图_生存分析如何绘制事件发生累计概率曲线图?
- ORACLE TEXT DATASTORE PREFERENCE(四)
- AngularJS recursive(递归)
- sorted set 数据类型的应用场景
- 监听localStorage变化(同页面监听)
- 数组及字符串相关知识
- VC 写 TXT 文件分割器 附代码
- springboot中配置过滤器以及可能出现的问题
- App个人信息保护合规十大常见问题及处置策略
- IDEA 同一个工程下不同模块之间的类相互调用
- “懒癌”患者福音:是时候找一个AI帮你做家务了
- php基础案例例子,PHP基础案例教程
- 美好的十年工程师生涯
- 单片机原理与应用技术(六)———红绿灯汇编语言
- list对象转map
- axios 的简化写法
- 在wps里面怎么设置触发器_wps如何制作触发器
热门文章
- python 分布式框架_python分布式框架rq的使用
- delphi 鼠标获取窗口句柄_Windows窗口自定义,只需WindowTop一键设置
- 大一计算机理论考试知识点,计算机一级考试理论知识点整理.doc
- html怎么用ui打开,HTML5教程 如何使用原生UI
- xml.etree ElementTree简介
- 实验结果报告与实验总结_教科版科学四年级上册实验报告
- just函数python_提升 Python 性能 Numba 与 Cython
- Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?
- 干货 | 仅需10分钟,开启你的机器学习之路!
- tcp 发送数据长度比预设缓存大_一文秒懂 TCP/IP实际五层结构(下篇)