内存/边界对齐(boundary alignment)简介
来源:互联网 发布:我的淘宝店铺怎么登陆 编辑:程序博客网 时间:2024/04/26 07:06
一、什么是内存对齐
先来看一个结构:
typedef struct _tagMem_Align{char c1; short s;char c2;int i;}Mem_Boundary_Aligment;
假设没有边界对齐,即内存是紧凑排列的,那么假设c1的地址是0,那么s的地址就是1,c2的地址就是3,i的地址就是4.即:
&c1=00000000,&s1=00000001,&c2=00000003,&i=00000004.
事实是否如此呢?我们写段程序来验证下:
Mem_Boundary_Aligment MemAligExample; printf("start adress,c1:%p, s:%p,c2:%p, i:%p", (unsigned int) (void *)&MemAligExample.c1- (unsigned int) (void *)&MemAligExample, (unsigned int) (void *)&MemAligExample.s- (unsigned int) (void *)&MemAligExample, (unsigned int) (void *)&MemAligExample.c2- (unsigned int) (void *)&MemAligExample, (unsigned int) (void *)&MemAligExample.i- (unsigned int) (void *)&MemAligExample, );
输出结果为:
&c1=00000000,&s1=00000002,&c2=00000004,&i=00000008.
为什么会这样呢?这就是内存对齐起到的效果。
内存对齐,也叫边界对齐(boundary alignment),是处理器为了提高处理性能而对存取数据的起始地址所提出的一种要求。编译器为了使我们编写的C程序更有效,就必须最大限度地满足处理器对边界对齐的要求。
二、内存对齐有什么作用?
从处理器的角度来看,需要尽可能减少对内存的访问次数以实现对数据结构进行更加高效的操作。为什么呢?因为尽管处理器包含了缓存,但它在处理数据时还得读取缓存中的数据,读取缓存的次数当然是越少越好!如上图所示,在采用边界对齐的情况下,当处理器需要访问a_变量和b_变量时都只需进行一次存取(图中花括号表示一次存取操作)。若不采用边界对齐,a_变量只要一次处理器操作,而b_变量却至少要进行两次操作。对于b_,处理器还得调用更多指令将其合成一个完整的4字节,这样无疑大大降低了程序效率。
注:本文有参考李云著作和网上作品。
0 0
- 内存/边界对齐(boundary alignment)简介
- 内存对齐 alignment
- 内存对齐 alignment
- 内存对齐(Memory Alignment)
- VC内存对齐准则(Memory alignment)
- 内存对齐(Data Structure Alignment)
- VC内存对齐准则(Memory alignment)
- C++类的内存对齐-C++alignment
- 为什么要内存对齐?字节对齐和边界对齐介绍。
- ARM内存边界对齐以及sizeof问题
- struct自然边界上的内存对齐
- ARM内存边界对齐以及sizeof问题
- 什么是边界扫描(boundary scan)?
- 边界对齐
- 边界对齐
- 不可不知的内存对齐(Memory Alignment)
- Arm结构体gcc内存边界对齐问题(zt)
- 数据结构内存边界对齐的三条原则
- android 系统架构 源码目录结构详解
- MFC-个人所得税计算器
- 利用DEM绘制等高线
- WebView缓存处理
- iis7 发布mvc 遇到的HTTP错误 403.14-Forbidden Web 服务器被配置为不列出此目录的内容
- 内存/边界对齐(boundary alignment)简介
- PAT A 1002. A+B for Polynomials (25)
- java 工厂类
- 学习Python
- java反射机制与动态代理
- 如何写出高质量的javascript代码
- uva 1331 - Minimax Triangulation(dp)
- Matlab并行运算
- 第八周——分数类中的运算符重载