现在我的结构看起来像这样:
struct Struct {
uint8_t val1 : 2;
uint8_t val2 : 2;
uint8_t val3 : 2;
uint8_t val4 : 2;
} __attribute__((packed));
有没有办法让所有val
成为一个数组?这一点不是空间,而是所有值的位置:我需要它们在没有填充的情况下存储在内存中,每个占用2位。拥有数组并不重要,通过索引进行简单访问的任何其他数据结构都可以,无论是纯C还是C ++都无关紧要。读/写性能很重要 - 它应该与简单位操作相同(类似),现在用于索引访问。
更新
我想要的完全可以描述为
struct Struct {
uint8_t val[4] : 2;
} __attribute__((packed));
答案 0 :(得分:1)
不,C仅支持位域作为结构成员,并且您不能拥有它们的数组。我认为你不能这样做:
struct twobit {
uint8_t val : 2;
} __attribute__((packed));
然后执行:
struct twobit array[32];
并期望array
由32个2位整数组成,即8个字节。我认为内存中的单个char
不能包含不同struct
的部分内容。我现在没有方便的段落和诗句。
您将不得不自己动手,通常使用宏和/或内联函数来进行索引。
答案 1 :(得分:0)
你必须手动完成正在进行的一些事情:
constexpr uint8_t get_mask(const uint8_t n)
{
return ~(((uint8_t)0x3)<<(2*n));
}
struct Struct2
{
uint8_t val;
inline void set_val(uint8_t v,uint8_t n)
{
val = (val&get_mask(n))|(v<<(2*n));
}
inline uint8_t get_val(uint8_t n)
{
return (val&~get_mask(n))>>(2*n);
}
//note, return type only, assignment WONT work.
inline uint8_t operator[](uint8_t n)
{
return get_val(n);
}
};
请注意,如果使用实际的汇编命令,则可能会获得更好的性能。
另请注意,(几乎)无论如何,uint8_t [4]都会有比这更好的性能,而处理器对齐类型(uint32_t)可能会有更好的性能。