从内存角度深入看结构体(window/linux)大小

今天我们来看一下windows(32, 64)(dev-c++,vc),linux(32, 64)不同系统下,

它们求结构体大小时,编译器到底给它们分配了哪些内存,又为什么这样分配,为啥子编译器给它们有时空闲3个内存块,有时候又空闲7个内存块,为什么啊,为什么啊


当你们读了上面的内容,还想继续往下看的时候,就说明你开始关注内存的分配问题了,哈哈!!!


关于内存对齐:

简单地理解就是:程序中,数据结构中的变量等等都需要占用内存,系统采用内存对齐,就可以提高访问速度(为了访问未对齐的内存,处理器需要作两次内存访问,而经过内存对齐一次就可以了)


大家看下面这个程序:

#include <stdio.h>

struct stu{
	char a;
	int b;
	char c;
};



int main(){
	struct stu ss;
	
	printf("%d\n", sizeof(ss));
	printf("%p\n", &ss.a);
	printf("%p\n", &ss.b);
	printf("%p\n", &ss.c);

	return 0;
}

当前结构体里面的成员类型是:(char , int, char)

下面大家看程序运行结果:

结果一:

win7,32位,vc中


win7,64位,vc中


结果二:

win7,32位,dev-c++中

win7,64位,dev-c++中


我们知道这涉及一个概念——偏移量

网上给出的解释是:它指的是结构体变量中成员的地址和结构体变量地址的差。

结构体大小的定义是:结构体的大小等于最后一个成员的偏移量加上最后一个成员的大小

哈哈,听饶了吧!

其实,当前偏移量的大小就是编译器为前面变量所分配的内存个数。

大家先看一下上面结构体在内存中(下面的是在dev中分配的)的情况


首先,我们知道编译器给一些变量分配内存的时候,它是一个连续的块,它是以一个4字节简单对其的

如上图所示:

编译器首先分配了一块地址也就是:0022FEB4给了结构体的首地址(也就是结构体中的成员a)因为它是一个字符,它占用一个内存地址,第二个是int类型,它占用4个字节,第一组已经用掉一格,还剩3格,肯定无法放下int型,考虑到内存对齐,所以不得不把它放到第二个组块(0022feb8),第三个类型是char类型,跟第一个类似࿰

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值