C -- 位字段

位字段(bit field

1.使用结构构建可访问对应位的位字段:

优点提供可以更紧凑的存储数据的方式,使用特定位
缺点移植性差
基本单元unsigned int

//如何创建位字段
struct bits_field
{
	unsigned int color : 3;		//有效使用3bits,范围0-7
	unsigned int opaque : 1; 		//有效使用1bit,范围0-1
	unsigned int : 2;	//匿名字段,不使用,仅占位
	unsigned int : 0;	//0字段,强制对齐到下一个机器字长位
	unsigned int style : 2;		//有效使用2bits,范围0-3
};
//此操作使用了8bits创建了一个位字段模版;
//其中仅有效使用6bits;

//如果数据自低位向高位填充位字段
//如10      1     011
//即style opaque color
//由于不同模型机位字段填充方式可能不同,因此位字段移植性差;

2.访问位字段,位字段也是由结构创建,因此可以用.成员运算符访问对应位段:

//利用上面的位字段模版创建一个位字段结构变量
struct bits_field box;

//初始化,与结构初始化相同,注意对应成员字段的范围
box = {4,0,3};		
//color 3bits 范围000-111即0-7
//opaque 1bit 范围0-1即0-1
//style 2bits 范围00-11即0-3

//可使用.成员运算符修改位段
box.color = 5;
box.opaque = 1;
box.style = 0;

(warning)

同类型编程问题中,位字段与按位运算符是可以替换的两种方法
位字段与按位运算都有局限性,受限于具体机型载入内存的方式

补充–关于C11的对齐特性

1. _Alignof()

给出对应类型的对齐要求:
参数类型:type;
返回类型:size_t aligment;

//区别于sizeof()给出对应类型字节长度

//_Alignof()给出内存分配时地址存放要求,分配的地址一定是alignment的倍数,这叫对齐
_Alignof(char);
1			//1倍数的地址可供使用,如0x1,0x2可连续存放char
_Alignof(int);
4			//4倍数的地址可供使用,如0x4,0x8可连续存放int
_Alignof(double);
8			//8倍数的地址可供使用,如0x8,0x16可连续存放double

2. _Alignas()

指定变量或类型对齐值,不应小于基本对齐值:
参数类型:type/aligment;
返回类型:void;

//3种等价方式
char _Alignas(double) ch1;
_Alignas(double) char ch2;
char _Alignas(8) ch3;

3. <stdalign.h>

#include <stdalign.h>
//可以使用alignof, alignas 作为 _Alignof, _Alignas的别名;

4. 对齐动态内存分配

C11添加了对齐动态内存分配函数到<stdlib.h>:

//对齐动态内存分配函数原型
void * aligned_alloc(size_t aligment, size_t size);
//第一个参数给出对齐要求
//第二个参数为需要分配的空间

2019.12.6
修炼之路(一)
未完待续
归期不定
by lx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值