今天我们来看一下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类型,跟第一个类似