程序员宝典中,关于结构体对齐问题,看了一晚上帖子,包括内存,CPU等等的,现在总算有些理解
要弄清结构体对齐,首先要明白为什么要对齐?
1. 先想想简单的hello.c整个运行过程中外设,内存,CPU的工作过程
计算机的所有工作都是要经过内存的,包括网页得读取等等
我们平时说的32位机器是指指令和数据是32位的,可以处理的数据量的增大。64位机时通用寄存器的位数,同时地址编码也是,这样寻址方位就增大。
2. CPU在读取内存时,是把内存看成是一块块的,如2,4,8,16个字节的块。
这样的话,假如把一个Int 类型的数据存储到1地址时候,就要先读出前四个字节,然后再读出四个字节,就需要读出两次,而且对有的处理器来说,根本不支持这种方法。
所以,为了提高效率,避免有些不支持多次读取的处理器错误,需要进行内存对齐。
内存对齐跟操作系统,编译器,计算机有关的,一般情况下在VC里默认的对齐方式是#pragma pack(n)
结构对齐方式:1. 对每一个元素的地址,必须是p(取n和sizeof(type)中的较小的值)的倍数
2. 整个结构的大小之和,必须是q(取n和各个sizeof(type)中的最大者中的较小者)的倍数------避免结构数组带来的问题
可以指定对齐规则,当指定的对齐规则太大时候,发挥不了作用。
最好使用时候指定对齐规则,#pragma pack(push) 指定 #pragma pack(pop)
这样的话避免因为在不同机器系统上读取结构时,因为内存对齐带来的不可移植性。
参考:英文网站 http://www.ibm.com/developerworks/library/pa-dalign/