C语言中 struct成员变量顺序对内存的占用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liuyunjay66/article/details/10553051

          在C语言的结构体中,是会按照其变量类型来进行分配内存大小的。但是对于不同的编译器,结果是不同的,在VC++6.0中是怎么个分配情况呢?用一下C中的关键字sizeof()来测试下,注意sizeof()不是函数哦!只是关键字而已。下图就是在VC++6.0中的字节分配情况:


下面来分析一下,C中结构体中成员变量的写法,对占用内存的影响。


却发现结果不是13个字节?却是24个字节?为什么呢?哦!肯定是编译起的问题,对,没错,就是编译器的问题,VC++6.0默认是按照成员变量本身类型来对齐的,比如char 占一个字节,就会按照1个字节对齐,short占两个字节,就会按照2个字节对齐,同理,int 4个字节对齐,

默认方式下对齐步骤为:

1.成员变量都按照自己的对齐方式对齐

2.最后整个结构体在按照最大对齐参数对齐 也就是圆整法。

比如上面例子中:第一个成员为int型,所以按照4个字节对齐(第一个成员的偏移值都是0)字节对齐,说白了就是当前的偏移地址必须为n的整数倍,比如4个字节对齐,就是说当前的偏移字节数必须为4的倍数,因为第一个成员都是从offset为0开始的,所以先上4个字节来存Int,然后第二个为double,占8个字节,也就是此时偏移地址,必须为8的倍数,明显前面只有4个字节,不能被8整除,所以必须在填4个字节的空白字节,然后在填充8个字节给ch,最后一个为char类型的,占一个字节,都能被1整除。所以成员变量对齐后,占17个字节。最后为整体对齐,也就是sizeof(stu)的大小了,按照整体的规则,必须为最大对齐参数的整数倍,max(sizeof(int,double,char)=8所以17往上加,第一个被8整除的就是24,所以最后sizeof后为24。

好我们在结构体中把各个结构体成员变量顺序变一下,看下占用多少内存



同理按照上面分析可得到上图所示。

那么程序员如何按照自己的方式来内存对齐呢?用预编译命名

#pragma pack(n)

.......

#pragma pack  中间的代码都将按照n字节来对齐。

具体规则如下:本质和上面两条规则一样

1.各个成员变量按照min(n,sizeof(item))来对齐

比如 int i;这个时候,int占4个字节,n=1,此时就是按照1个字节来对齐的。

2.整体对齐的时候,还是按照最大的对齐参数来对齐。

这里最大的对齐参数为每个成员变量所最大的对齐参数.y=min(maxsizeof(item),n)
可以看出当n=1时,将按照成员变量本身对齐。


展开阅读全文

没有更多推荐了,返回首页