C/C++之内存对齐
来源:互联网 发布:js埋点代码收集脚本 编辑:程序博客网 时间:2024/06/16 22:50
1、什么是内存对齐
计算机系统对基本类型数据在内存中放的位置做了限制,它们会要求这些数的首地址是一个数(一般为4和8)的整数倍,我们看下结构体的大小
#include <stdio.h>struct A{ char a; int b;};int main(){ printf("size of struct A is %d\n", sizeof(struct A)); return 0;}
结果:
1111deMacBook-Pro:digui a1111$ ./sizeofsize of struct A is 8
结果是8,不是5,是由于内存对齐导致
1:a
2
3
4
5:b
6
7
8
2、为什么要内存对齐
牺牲了空间,加快cpu寻址速度,加快读取内存数据速度。
内存是以字节为单位,但处理器不是以字节块来存取,一般用双字节,四字节,8字节,16字节,或者32字节来存取内存,这些存取单位为内存存取粒度
比如没有内存对齐,用4字节存取粒度, int变量放在地址为1的地方,我们从0地址开始读区数据,第一个读区范围是0到4,但是这事后没有读完,有效地址还有,4到5,然后第二次,读区从4到8,然后把2块有效数据合并放入寄存器,需要做很多工作,如果有内存对齐,从0地址开始存储,可以一次性读完,不需合并数据,所以加快了效率,
3、用#pragma pack(n)对内存不对齐
加入内存对齐
#include <stdio.h>struct A{ int a; char b; char c;};struct B{ char a; int b; char c;};int main(){ printf("size of struct A is %d\n", sizeof(struct A)); printf("size of struct B is %d\n", sizeof(struct B)); return 0;}结果分别是:
8 12
然后用#pragma pack(n)处理内存不对齐,比如我们用#pragma pack(1)
#include <stdio.h>#pragma pack(1)struct A{ int a; char b; char c;};struct B{ char a; int b; char c;};int main(){ printf("size of struct A is %d\n", sizeof(struct A)); printf("size of struct B is %d\n", sizeof(struct B)); return 0;}结果都是
6 6
如果用#pragma pack(2)
结果就是
结果就是
6 8
我们可以这样理解,pack(n),结构体的成员变量的首地址可以是n倍的开头
阅读全文
0 0
- C语言之内存对齐
- C语言之内存对齐
- C语言之内存对齐
- C语言之内存对齐
- C/C++之内存对齐
- C语言之内存对齐小析
- C语言之内存字节对齐
- C语言之内存对齐数
- C语言之内存对齐浅谈
- [C++]我的理解之内存对齐
- C语言之内存对齐(一)
- C之内存分类
- C语言之内存使用
- C语言之内存操作
- C语言之内存管理
- C语言之内存管理
- C语言之内存操作
- C语言之内存管理
- 【软工视频总结】-- 软件工程
- 版本控制工具Git的使用
- 共同学习Java源代码-多线程与并发-FutureTask类(二)
- POJ 1321 棋盘问题(DFS)
- unity场景切换、截屏、打开网址、退出应用程序
- C/C++之内存对齐
- 【C++温故】(2) 类的继承(一)
- 决策树 — Decision Tree
- 开始数据结构总复习 全部的数据结构代码
- 安装windows7导致Ubuntu启动项消失的问题的又一解决办法
- 每日练习|Day018
- 程序是怎么跑起来的?(2)---2进制
- 《天才在左疯子在右》读后感
- MongoDB用mongoimport导入大文件报错