|
![]() | 作者: kert_t8 [kert_t8]
![]() |
登录 |
最近发现一些C语言程序的结构(struct)定义常常会出现用char占位的情况 比如,如果前面使用了 代码: 那么接下来它会使用一个 代码: 来对齐。据说这样做是为了在进行操作的时候快一些。但是我没能弄明白为什么。这个应该跟现在一个寄存器的字长有关,我一直没有弄明白为什么这样就加速了。谁给我讲讲? 还有,我觉得既然现在一个寄存器是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号