C语言中 struct成员变量顺序对内存的占用
2013-08-29 21:02
316 查看
在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时,将按照成员变量本身对齐。
下面来分析一下,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时,将按照成员变量本身对齐。
相关文章推荐
- C语言中 struct成员变量顺序对内存的占用
- C语言struct内存占用问题
- windows下变量在内存中的字节存储顺序(c语言)
- C语言中的全局变量内存分配和初始化顺序
- C语言中的全局变量内存分配和初始化顺序
- 关于构造函数析构函数以及成员变量内存分配顺序的一些问题
- C语言struct内存占用问题
- C语言定义结构体时注意成员变量的类型和声明顺序
- C语言struct内存占用问题
- c / C++ 中的struct 和memcpy函数 class 对象成员变量内存是否连续
- 深入理解C语言结构体成员变量内存分配
- 内存对齐-C语言struct内存占用问题
- C语言之struct大小、首地址与内存对齐—由结构体成员地址得到结构体首地址
- java开发C语言解释器:结构体内存与成员变量的一致性
- C语言struct内存占用问题
- 受检查异常要求try catch,new对象时,就会在堆中创建内存空间,创建的空间包括各个成员变量类型所占用的内存空间
- 在c语言中struct的变量中.和->区别
- Java 构造方法和成员变量初始化顺序
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- java成员变量,静态成员变量,静态代码块,代码块和构造函数等加载顺序