一.基础概念
位段可以控制结构体内每个元素的内存大小,单位为字节。
用于节省内存
二.位段的内存分配
结构体元素为整形时,内存不够时开辟四个字节(32个比特位)
结构体元素为字符型时,内存不够时开辟一个字节(8个比特位)
位段的成员只能是整形家族
例一:
#include<stdio.h>
typedef struct S1
{
//元素a为int,开辟4个字节内存(32bit)
int a : 2;
int b : 5;
int c : 10;
int d : 30;
//2+5+10+30=47>32,内存中装不下了,开辟空间
//在vs编译器下,d存储在新开辟的空间中
//故总共内存使用4+4=8字节(32bit)
}S1;
int main()
{
printf("%zd",sizeof(S1));
return 0;
}
例二:
#include<stdio.h>
typedef struct S1
{
//元素a为,开辟1个字节内存(8bit)
char a : 3;
char b : 4;
char c : 5;
//3+4+5=12>8,内存中装不下了,开辟空间
// 在vs编译器下,c存储在新开辟的空间中
//元素c为int,开辟1个字节(8bit)
char d : 4;
//5+4=9>8,内存中装不下了,开辟空间
// 在vs编译器下,d存储在新开辟的空间中
//元素d为int,开辟1个字节(8bit)
//故:总共内存使用1+1+1=3个字节(24bit)
}S1;
int main()
{
printf("%zd",sizeof(S1));
return 0;
}
三.易错点
1.位段申请的内存大小不能超过数据类型大小
2.位段在内存中的存储方式为从右向左
#include<stdio.h>
typedef struct S1
{
char a : 3;
char b : 4;
char c : 5;
char d : 4;
}S1;
int main()
{
S1 s = {0};
s.a = 10;
s.b = 12;
s.c = 3;
s.d = 4;
return 0;
}
四.位段的跨平台问题
若要解决跨平台问题,则要了解各个平台的底层机制来写出相应的代码。
五.位段的现实应用
位段一般应用于网络,通过对信息数据大小的极值压缩,减少信息传输的时间和算力。