c – 具有非八位字节对齐子字段的96位长位字段

我需要一个96位长的结构,我可以将自定义位字段放入其中.这些领域的长度遍布整个地方,分别为8,3,26,56.重要的是它们保持这些精确的长度(有一个例外,见下文).

我看到了将数据连接成一个紧凑字段的多种方法:std :: bitset,structs(连续保持字段),当然只是使用整数.然而:

> bitset方法存在问题,因为操作需要非常快速地进行:bitset不提供一种方法,可以通过一次原子操作立即设置整个范围(0..96)的范围(x..y).如果我要循环设置单个位,该死的.
>结构方法存在问题,因为长度限制为this.
> int方法存在问题,因为int64_t不够长.我当然可以使用int32_t,但请参见下文.

一个明显的解决方案是将56个8字段放入int64_t,其余字段放入int32_t.这里的问题是56长字段是唯一一个事实上可以在开发后期减少的字段,这意味着我将在int64_t中有一些备用位,而某些32 – (26 3)= 3备用int32_t中的位.

有没有办法尽可能紧凑地存储这些(从代码的角度来看),同时仍然可以通过屏蔽访问广泛的区域(与std :: bitset不同)?

最佳答案
好的,你有一个经典的尺寸与速度的情况.我要问,这是一种每一点都重要的情况吗?如果没有使用几个位,这是一件大事吗?我的C编码器喜欢3个32位值的数组,或者64位32位值的方法.我的优化器不喜欢这样的事实:96位数据结构不是完全缓存友好的,而是填充到128位,或者至少不能跨越4字节边界访问.

使用64位值(取决于您的目标平台)允许在1条指令中屏蔽整个56位条目,而32位版本至少需要2条操作.但是,如果你可以将该值降低到32位(或高达64位),那么,如果在64位地址边界上保留64位值,则根本不需要屏蔽和全速.某些目标将允许您以惩罚方式访问数据,而其他目标实际上会抛出异常.

最安全的方法是3个32位值的数组.您的对齐是有保证的,只要您没有与位域跨越32位边界,数学就可以保持简单,并且它将是最便携的.如果你必须跨越边界,你将通过额外的掩蔽和移动来获得速度.但是,这是一个大问题,你真的,真的确定访问这些数据是速度问题吗?您手头有个人资料显示这是一个瓶颈吗?如果没有,我会选择bitfield C解决方案,并称之为好.更安全和更容易使用几乎总是一个胜利.

转载注明原文:c – 具有非八位字节对齐子字段的96位长位字段 - 代码日志