论坛: 编程破解 标题: 关于对齐 复制本贴地址    
作者: kert_t8 [kert_t8]    论坛用户   登录
最近发现一些C语言程序的结构(struct)定义常常会出现用char占位的情况
比如,如果前面使用了
代码:

_UINT8 a[2];
_UINT8 b[8];


那么接下来它会使用一个
代码:

char  padding[6];


来对齐。据说这样做是为了在进行操作的时候快一些。但是我没能弄明白为什么。这个应该跟现在一个寄存器的字长有关,我一直没有弄明白为什么这样就加速了。谁给我讲讲?
还有,我觉得既然现在一个寄存器是32位的,那么对齐的话,4字节对齐就够了啊,为什么要对成16字节的呢?

地主 发表时间: 06-12-20 11:47

回复: kert_t8 [kert_t8]   论坛用户   登录
还有,刚才忘了说了,上面的对齐在struct中间,也就是说下面还有这个struct的其它定义。把struct分成一段一段的了。

B1层 发表时间: 06-12-20 11:49

回复: SysHu0teR [syshunter]   版主   登录
和寄存器无关。

这个能基本解惑: http://blog.csdn.net/soloist/archive/2004/12/12/213717.aspx

说“基本解惑”的意思就是按照我以前的理解层次,你给的结构体不会被对齐。

你把我也整糊涂了````



B2层 发表时间: 06-12-20 21:18

回复: 286 [unique]   版主   登录
这里的对齐不是数位对齐,而是把同一个数据放到某一个单位里。

比如,有很多个抽屉,每个抽屉里放32本书,按顺序分别放8本,16本,32本,64本。
方案1: 第一个放8+16+8(最后的8是32中的8),第二个放24(32中的24)+8(64中的8),第三个放32(64中的32),第四个放24(64中的24)。
方案2:第一个放8,第二个放24,第三个放32,第四、第五个放64。
方案1中,读8只打开一个抽屉即可,读16只打开一个即可。读32要打开两个方可,读64位,则需要开三个抽屉。方案2就不详说了。
很显然,方案2虽然浪费了空间,但增加了读的速度,现在的计算机,内存已不是宝贵的东西,而速度则显的重要。

这里的对齐,就是方案2中的对齐。

B3层 发表时间: 06-12-21 12:02

回复: kert_t8 [kert_t8]   论坛用户   登录
啊,我也基本被解惑了

对齐的原理286说得非常形象,syshunter给的连接上也说得很清楚

我给的那段程序没有问题啊,正好被做成8字节对其了。

但是我还是有疑问,我的struct里面如果没有double这样的8字节(double是8字节吧?)变量是不是可以对齐成4字节的呢?就是说 padding[2]就可以了?我的struct最严格的对齐应该也只有4个字节麻


我那个_UINT8 是8bit的unsigned int,只有1个字节

B4层 发表时间: 06-12-22 14:13

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号