关于对齐

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指令总是要求对齐的指令,对于未对齐的指令,数据对齐也会影响这些指令的使用。

Feedback

# re: 关于对齐  回复  更多评论   

2010-04-04 18:14 by anonymous
例如一个处理器总线宽度为32位,那么地址必须为8的倍数,也就是依次取出4个字节
这句话很奇怪,总线分地址总线,数据总线。如果数据总线是32位,一次取32位出来也就是4个字节。但和地址是多少没有关系。
总线是32位,地址也不一定是8的倍数。

# re: 关于对齐  回复  更多评论   

2010-04-04 18:18 by anonymous
如果总线是32位的,double占8个字节,你怎么可能一次就把8个字节的数据放在32位的总线上?

# re: 关于对齐  回复  更多评论   

2010-04-04 21:13 by rikisand
@anonymous
写错了~64位的数据总线

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理