您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
c语言-位域、内存单元、内存布局
发布时间:2021-04-15 20:39:25编辑:雪饮阅读()
所谓的位域其实就是为了节省内存,在结构体中比如说一个int的类型肯定4个字节,那么总共就会有32个位,那么如果我这个int型只存储一个开关状态,那么这个状态呢,它要么开,要么关,就是说用1或者0就可以表达了,那么二进制中用一个位就可以解决了。
这样岂不是浪费掉了好多的内存。
那么位域就是在结构体定义成员时可以为每个成员单独定义实际上要用的位的个数。当然这个位数是不能大于对应的基础数据类型的位数,比如你定义一个int型,那么你这个变量宽度就不能大于32吧。
那么位域的具体实现如:
#include <stdio.h>
int main(){
struct bs{
unsigned int widthValidated : 1;
unsigned int heightValidated : 1;
};
printf("%d\n", sizeof(struct bs));
return 0;
}
结果为什么是4呢?按理来说应该是,这不是定义了两个结构成员且都只占用2个变量宽度,那么应该是2啊?
其实这里首先你需要搞清,这里变量宽度的单位是位是bit。
那么首先呢这里定义的两个int型结构体成员,一般来说按标准肯定是8个字节,因为一个int是4个字节,但是有两个呢。
那么我们再来细细剖析下。
计算结构体大小时需要考虑其内存布局,结构体在内存中存放是按单元存放的,每个单元多大取决于结构体中最大基本类型的大小。
那么当前这个结构体由于两个结构成员类型都是int,所以这里一个单元肯定都是4个字节
也就是32个位。
那么当第一个结构体成员放入内存单元后,由于该成员定义了变量长度为1,所以此时这个内存单元就只剩下31个位了,那么此时呢当第二个成员准备放入内存单元时候,首先会判断这个成员实际占用大小,若剩下的位数不足以存放这第二个成员。那么第二个成员将会被放入下一个内存单元,那么下一个内存单元的大小也就是当前结构体最大的基础类型的字节数,这里即也就是32位,4字节。但是这里实际上刚才第一成员放入内存单元之后还有31个位,而第二个成员也就只使用一个位,所以足以存放的,那么也就是说这里整体就只用了一个内存单元,而这个内存单元是4字节的。
那么上面sizeof它输出的也就是求一个对象或者左值的字节数。所以最后的结果就是4咯。
关键字词:c语言,位域,内存单元,内存布局