每个人欢呼!
我想将一些数据存储在结构或数组的内存中。我的问题是数据对齐。我真的不能在char旁边使用8字节数据,因为它们将一起占用16个字节。
现在,我会对单个8字节字段感到满意,比如char,并使用剩余的7个字节来存储其他数据。
我该怎么做?支付的绩效惩罚是什么? 谢谢大家。
答案 0 :(得分:4)
您可以使用位域自动执行Arkku建议的位移数学运算:
struct {
uint64_t one_byte:8;
uint64_t seven_byte:56;
};
将会有轻微的访问开销,但如果你计划使用这么多的空间是非常宝贵的话,这是值得的。在如此多的内存中,改进的缓存局部性很容易抵消一些移位/掩码操作。
答案 1 :(得分:2)
使用8字节字段,您可以使用field & 0xFF
获得最低8位,其余位置使用field >> 8
。要分配值,您可以使用(seven << 8) | (one & 0xFF)
类似地构造字段(如果您知道one
只有8位,则可以省略0xFF)。
每次使用数据时都必须执行这些操作。
(作为更多的黑客,您可以直接使用强制转换来访问单字节部分,但是8字节字中的字节顺序将开始重要。)