浅谈结构体及linux下内存分配原则
2012-08-03 14:14
246 查看
结构体在程序中的应用是很广泛的,要处理的问题越复杂,数据量越多越杂,就越需要用到结构体。比如网络,内核,驱动等等。熟练使用结构体对每个程序员都是至关重要的。一个好的结构体不仅能使程序体系结构清晰,而且使得操作灵活,可扩展性强。linux网络之所以很强大,这和它里设计合理的数据结构有很大关系。
在定义中,可以限制变量的位的作用域,比如上面的:int xx:4;这表明xx的有效域只有4位,也就是能给他赋值的最大值为15,如果超过这个值,编译器就会报错:warning: overflow in implicit constant conversion。
在这里如果你给xx赋值为15,如:
然后输出:
结果会是:-1
因为这里定义的xx为int 型,15的二进制位1111,最高位为1,表示为负数,所以取反加1后为0001。所以是-1。
这种位域操作的好处是当你不需要用到你定义的类型的长度时,可以加位域操作以节省内存空间。
如上,我定义二个short int类型值,short int在32位linux下为2字节,这里二个相加不足一字节,但是输出sizeof(struct a)的值为2。不足一字节系统自动补满一字节。
这个输出也是2。xx超过一字节,但是9+2=11,还没有超过16(2字节),我猜系统将xx超过的那1bit分到了yy那1bit里面了。
这个输出是4。9+9=18,超过了16,系统各分配了2字节给xx和yy。
结构体定义:
struct a{ int xx:4; int yy:4; };
结构体初始化:
方式一:
struct a aa ={ xx:2, yy:3 };
方式二:
struct a cc ={ .xx=6, .yy=1, };
方式三:
struct a dd={4,2};
在定义中,可以限制变量的位的作用域,比如上面的:int xx:4;这表明xx的有效域只有4位,也就是能给他赋值的最大值为15,如果超过这个值,编译器就会报错:warning: overflow in implicit constant conversion。
在这里如果你给xx赋值为15,如:
struct a cc ={ .xx=15, .yy=1, };
然后输出:
printf("cc.xx = %d\n",cc.xx);
结果会是:-1
因为这里定义的xx为int 型,15的二进制位1111,最高位为1,表示为负数,所以取反加1后为0001。所以是-1。
这种位域操作的好处是当你不需要用到你定义的类型的长度时,可以加位域操作以节省内存空间。
引出的其他问题
这里用sizeof(struct a)得到的是4,如果不加位域限制则是8,至于为什么是4呢?4bit+4bit应该刚好是1byte啊,应该是1才对啊。这是因为我是在linux下编译执行的,而在linux对内存分配最小值为类型值的一半。(我在linux下做了实验)如下我定义了一个结构体:struct a{ short int xx:2; short int yy:2; }bb;
如上,我定义二个short int类型值,short int在32位linux下为2字节,这里二个相加不足一字节,但是输出sizeof(struct a)的值为2。不足一字节系统自动补满一字节。
struct a{ short int xx:9; short int yy:2; }bb;
这个输出也是2。xx超过一字节,但是9+2=11,还没有超过16(2字节),我猜系统将xx超过的那1bit分到了yy那1bit里面了。
struct a{ short int xx:9; short int yy:9; }bb;
这个输出是4。9+9=18,超过了16,系统各分配了2字节给xx和yy。
相关文章推荐
- 浅谈windows和linux下内存分配规律
- 浅谈C/C++结构体内存分配问题
- Linux 中结构体的内存分配问题
- 【Linux开发】linux设备驱动归纳总结(五):1.在内核空间分配内存
- 浅谈Linux内存管理机制
- 结构体指针数组 内存分配 释放
- Linux进程分配内存的两种方式--brk() 和mmap()
- List容器内存分配原则
- 浅谈垃圾收集器与内存分配策略(引用计数算法)
- OO 中的继承分析:主要分析在编译和运行过程中 子类、父类 的字段和方法以及实例化时候在内存中分配 和 执行的先后,以及两个原则
- malloc函数是C/C++中常用内存分配库函数,本篇文章将以Linux平台上的malloc为剖析对象,深入了解分配一块内存的旅程。
- VC中结构体内存分配问题透析(sizeof)
- Linux常用内核态内存分配方式总结
- 【VS开发】【编程开发】【C/C++开发】结构体中的数组与指针的内存分配情况说明
- 浅谈设置JVM内存分配的几个妙招
- 浅谈内存分配那些事
- 浅谈Linux内存管理机制
- 内存地址Linux下内存分配与映射之一
- Linux系统的内存分配
- linux 内核内存分配