C ++:数据对齐和内存的有效使用(在时间和空间上)

时间:2010-11-20 08:29:59

标签: c++

每个人欢呼!

我想将一些数据存储在结构或数组的内存中。我的问题是数据对齐。我真的不能在char旁边使用8字节数据,因为它们将一起占用16个字节。

现在,我会对单个8字节字段感到满意,比如char,并使用剩余的7个字节来存储其他数据。

我该怎么做?支付的绩效惩罚是什么? 谢谢大家。

2 个答案:

答案 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字节字中的字节顺序将开始重要。)