有关struct的大小

来源:百度知道 编辑:UC知道 时间:2024/05/16 00:51:21
我用的是vc6.0编译器
struct ab{
char i;
char j;
int p;
} 结果为8
struct ab{
char i;
int p;
char j;
}结果为12
为什么??????

这个牵扯到内存对界(memory alignment,又称为变量对齐 )的问题,方便计算机进行处理,计算机在处理正好机器字长长度的内存单元的时候能发挥较大效率,例如32位及其,处理一个字符,实际上的过程是读入寄存器一个机器字长的内存数据,然后只处理指定字符的字节。

s {char c;int i;}; 在sizeof(char)=1 sizeof(int)=4的情况下sizeof(struct s)为什么经常是8不是5?
这个就是对齐(alignment)的缘故。
那么什么是对齐?现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就是对齐。为什么呢?msdn for vc6中有这么一段:
This principle is especially important when you write code for porting to multiple processors. A misaligned 4-byte data member, which is on an address that is not a multiple of four, causes a performance penalty with an 80386 processor and a hardware exception with a MIPS® RISC processor. In the latter case, although the system handles the exception, the performance penalty is significantly greater.
大意是:1.某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2.其余的硬件平台虽然可以在任何地址处取得任何类型的数据,但如果变量没有对齐的情况下,取这个数据可能有效率上的损失。
所以为了不出错或者优化,在访问特定变量的时候要在特定的内存地址访问,这也是很多时候管对齐叫优化对齐的缘故。普通情况下编译器负责做这件事情。对齐问题在移植的时候尤其需要考虑进去。
<