编写高效代码(13) 数据对齐访问
来源:互联网 发布:淘宝达人机构合作 编辑:程序博客网 时间:2024/06/15 08:21
在32位处理器中,一个int型变量占4个byte,假设这个变量i在内存中占据2、3、4、5这4个byte的位置,如下图所示。
数据非对齐存储
内核在访问这个数据时,会先将从0开始的4个byte读入到寄存器A中,再将从4开始的4个byte读入到寄存器B中,再将有效的数据拼成一个int数据,放在寄存器C中,可见,这种访问效率是多么的低下啊,如果变量i存储在从0开始的4个byte处,那么内核一次就能将i读入到寄存器中,这就是数据对齐与不对齐的访问差别。对于2字节的变量,它的起始地址应该为2的整数倍,对于4字节的变量,它的起始地址应该为4的整数倍,对于8字节的变量,它的起始地址应该为8的整数倍,这样访问效率才高。
处理器通常都会提供对齐的数据访问指令和非对齐的数据访问指令,对齐的数据访问指令效率要远高于非对齐的数据访问指令。
大数据结构时的Cache line对齐
程序会被Cache到程序Cache中,数据会被Cache到数据Cache中,从前面可知,如果发生Cache miss,会等待大量的时间。
Intel处理器的Cache line大多为64 byte,在对一个大数据结构(如一个大数组或大结构体)分配内存时,数据结构的起始地址最好为64 byte的整数倍,这样Cache miss的次数最少。例如,一个64 byte的数组,如果起始地址不是64的整数倍,则它会占据两个Cache line,访问时产生两次Cache miss,如果起始地址是64的整数倍,则只会占据1个Cache line,访问时只产生1次Cache miss。
在Windows平台上,可以使用下面的语句来指定对齐,在这条指令中,将数组指定为64 byte对齐。
__declspec(align(64)) int BigArray[1024];
来源:http://blog.csdn.net/muxiqingyang/article/details/7072157
- 编写高效代码(13) 数据对齐访问
- 编写高效代码(6) 数据对齐访问
- 连载:编写高效代码(13) 数据对齐访问
- 连载:编写高效代码(14) 程序、数据访问符合Cache的时间、空间局部性
- 编写高效代码(14) 程序、数据访问符合Cache的时间、空间局部性
- 编写高效代码(8) 程序、数据访问符合Cache的时间、空间局部性
- Arm汇编学习笔记(九)——高效的分支代码及非对齐数据的访问
- 编写高效android代码
- 编写高效 Android代码
- 编写高效Android代码
- 高效编写Android代码
- 高效JQuery代码编写
- 高效JQuery代码编写
- 编写高效JavaScript代码
- 编写高效jQuery代码
- 编写java高效代码
- 编写高效代码
- 连载:编写高效代码(6)——降低数据精度
- 云计算
- 如何在SELinux中为新的后台程序编写策略
- 根据IP定位用户所在城市信息
- 在Mac Cocoa程序里使用多个xib,实现多个窗口切换
- FreeBSD 系统信息
- 编写高效代码(13) 数据对齐访问
- 三星i9100 Galaxy S2 解决刷机无限卡在第一屏的详细终极教程【全方位指导②】【晓庄
- JavaSE第四十三讲:使用LinkedList实现Stack与Queue
- 面试题 找到字符串中第一个只出现一次的字符
- linux命令行(十三)
- Linux下Weblogic的使用问题记录
- javaWeb-xml解析概述和DOM&SAX解析原理
- 类,含成员函数,输出时间。
- LINUX 输入子系统架构分析