Posted on 2010-04-04 16:00
rikisand 阅读(415)
评论(3) 编辑 收藏 引用 所属分类:
C/C++
数据对齐:是指数据所在的内存地址必须是该数据长度的整数倍。处理器可以直接访问对齐的数据,而访问未对齐的数据会在内部进行一系列的调整,虽然可以正常处理,但是会降低运行速度。例如一个处理器总线宽度为64位,那么地址必须为8的倍数,也就是一次取出8个字节。如果我们可以保证所有double地址都为8的倍数,那么可以用一个存储器操作来读或者写double了,否则我们可能需要执行两次存储器访问,因为对象可能位于两个8字节存储器块中
对于结构体也是一样的例如 struct s2{int i;int j;char c;}; 如果我们把这个结构打包成9个字节,只要保证起始地址满足4的对齐要求我们就可以保证i j的对齐,不过如果我们声明了一个数组,那么元素地址成为 xd,xd+9,xd+18,xd+27 不满足对齐了。因此我们呢要分配12个字节给这个结构体
更进一步 :
未对齐的数据会以不同方式给cpu带来麻烦~
1.如果一个变量被划分到两个缓存行,那么我们需要访问两个缓存行才可以。
2.一些simd指令总是要求对齐的指令,对于未对齐的指令,数据对齐也会影响这些指令的使用。