结构体造成的内存空洞
2016-11-20 20:57
627 查看
实际编程时,经常需要处理批量数据,对于同类型的数据,我们可以使用数组来保存,但是如果是对不同类型数据进行批量处理,这就需要结构体了;
结构体给我们变成带来了很多便利,但是它也有自身的缺陷:那就是容易造成内存空洞。
首先我们来看一下下面的程序:
sizeof的功能是计算N的内存大小的,一般来说,很多人会认为输出结果是 1(char 型) + 4 (int型)+ 1 (char 型) + 1(char型) = 7;
但是实际结果是 12.
那么 12 是怎么来的呢?
首先我们要知道,在结构体分配空间时,如果结构体中出现4个字节及以上的变量时,给每个变量分配空间时都是按字对齐分配的(就是4个字节,4个字节。。。来分配),
如果结构体中没有出现4个字节以上变量,则按半字对齐,(2个字节,2个字节。。来分配)。
在本例中,因为出现了int 型的4个字节的变量 num,所以分配空间是按字对齐分配的,下面我们来阐述本例是怎么给结构体各个变量依次分配空间:
1. 给ch1分配空间,因为是字对齐分配,所以给了4个字节存放ch1,但是ch1是char型,只占用了1个字节,还有3个字节空着。
2.给num分配空间,因为之前分配的空间只剩3个字节未被占用,不能存放4个字节的int型数据,所以,又分配按字对齐分配4个字节给num,num占满了这4个字节;
3.给ch2分配空间,因为它上面的空间被num占满了,只能再按字对齐分配4个字节,存放ch2后还剩3个字节;
4。给ch3分配空间,因为上面还有3个字节的空间,可以存放完ch3,所以不需要再分配空间。
上面四个步骤总共分配了3次4个字节,所以占用了12字节。
通过这个例子可以看出,我们分配了12个字节给结构体,这12个字节中只有7个字节存放了数据。这就是内存空洞。
结构体给我们变成带来了很多便利,但是它也有自身的缺陷:那就是容易造成内存空洞。
首先我们来看一下下面的程序:
#include <stdio.h> struct node //noid为结构体名 { char ch1; int num; char ch2;
char ch3; }; int main() { struct node N; printf("sizeof(N) = %d\n", sizeof(N)); return 0; }
sizeof的功能是计算N的内存大小的,一般来说,很多人会认为输出结果是 1(char 型) + 4 (int型)+ 1 (char 型) + 1(char型) = 7;
但是实际结果是 12.
那么 12 是怎么来的呢?
首先我们要知道,在结构体分配空间时,如果结构体中出现4个字节及以上的变量时,给每个变量分配空间时都是按字对齐分配的(就是4个字节,4个字节。。。来分配),
如果结构体中没有出现4个字节以上变量,则按半字对齐,(2个字节,2个字节。。来分配)。
在本例中,因为出现了int 型的4个字节的变量 num,所以分配空间是按字对齐分配的,下面我们来阐述本例是怎么给结构体各个变量依次分配空间:
1. 给ch1分配空间,因为是字对齐分配,所以给了4个字节存放ch1,但是ch1是char型,只占用了1个字节,还有3个字节空着。
2.给num分配空间,因为之前分配的空间只剩3个字节未被占用,不能存放4个字节的int型数据,所以,又分配按字对齐分配4个字节给num,num占满了这4个字节;
3.给ch2分配空间,因为它上面的空间被num占满了,只能再按字对齐分配4个字节,存放ch2后还剩3个字节;
4。给ch3分配空间,因为上面还有3个字节的空间,可以存放完ch3,所以不需要再分配空间。
上面四个步骤总共分配了3次4个字节,所以占用了12字节。
通过这个例子可以看出,我们分配了12个字节给结构体,这12个字节中只有7个字节存放了数据。这就是内存空洞。
相关文章推荐
- 关于结构体中的内存空洞、sizeof(struct)以及编译器优化的见解
- 结构体 内存空洞
- 结构体变量对齐的理解,不同的对齐方式,造成不同的内存划分,从而满足不同平台的读写效率.
- inputMethodManager造成的内存泄漏问题
- .net 互操作之p/invoke- 数据封送(结构体中的字符串,其他字段,内存布局)(4)
- vector删除元素与清除内存空洞
- java造成内存泄露原因
- 防JDK8重复类定义造成---内存泄露
- C语言中结构体的内存对齐问题
- 详解结构体、类等内存字节对齐
- 结构体内存对齐的补充说明与总结
- 此时无足够的可用内存,无法满足操作的预期要求,可能是由于虚拟地址随便造成的。请稍候重试。 .
- 结构体的内存分配
- c语言结构体内存模型及计算(转载)
- C语言中结构体和共同体在内存中占用字节数
- 结构体和类中的内存布局
- Mysql: Connect/C++ 使用过程中发现返回 std::string 造成的内存泄露
- 结构体的内存对齐
- 如何减少频繁分配内存(malloc或者new)造成的内存碎片?
- Android中使用Handler造成内存泄露的分析和解决