堆和栈详解!附一篇,应用实例。

来看看编译器对字节对齐的优化处理。

测试实例: 

#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要牺牲更大的内存空间。不过,这是为什么呢?

备注:本文所涉及到的字节对齐问题,和字节序是大端小端没有任何关系的!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值