来看看编译器对字节对齐的优化处理。
测试实例:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
int a;
char b;
int c;
printf("0x%08x\n",&a);
printf("0x%08x\n",&b);
printf("0x%08x\n",&c);
getch();
return 0;
}
1.Dev_C++编译器输出结果及分析:
a的起始位置是:0x0022ff74
b的起始位置是:0x0022ff73
c的起始位置是:0x0022ff6c
可以发现,int型占用四个字节。在内存中的排布情况应该是如下图所示:【从高地址向低地址分配内存】
|c----|---b-|a----| 也就是空闲了中间的三个字节!
2.vs2005编译器输出结果及分析:
a的起始位置是:0x0012ff60
b的起始位置是:0x0012ff57
c的起始位置是:0x0012ff48
可以发现,int型占用8个字节!在内存中的排布情况应该是如下图所示:【从高地址向低地址分配内存】
|c--------|-------b-|--------|a--------| 中间补齐了8个字节!
3.hp_ia32平台,gcc编译器输出结果及分析:
a的起始位置是:0x7ffff2b0
b的起始位置是:0x7ffff2b4
c的起始位置是:0x7ffff2b8
可以发现,int型占用4个字节!在内存中的排布情况应该是如下图所示:【从低地址向高地址分配内存】
|a----|b----|c----| 中间空了3个字节!
总结:很明显,在字节对齐方面,vs2005要牺牲更大的内存空间。不过,这是为什么呢?
备注:本文所涉及到的字节对齐问题,和字节序是大端小端没有任何关系的!