来看看编译器对字节对齐的优化处理。
测试实例:
#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要牺牲更大的内存空间。不过,这是为什么呢?
备注:本文所涉及到的字节对齐问题,和字节序是大端小端没有任何关系的!

本文详细分析了在字节对齐优化下,Dev_C++, vs2005, 和 gcc 编译器如何在不同平台下处理 int、char 和 int 类型变量的内存分配,揭示了内存使用效率和布局的独特之处。
2万+

被折叠的 条评论
为什么被折叠?



