访问字节中的结构或位子集是否更快?

时间:2017-03-13 14:28:49

标签: c++ c performance

假设我有三部分信息,它们可以作为一个字节的一部分存储。

  • info_a是3位长
  • info_b是2位长
  • info_c是3位长

我没有任何内存限制。

第一个实现是

struct info{
  unsigned char info_a;
  unsigned char info_b;
  unsigned char info_c;
}

第二个实现是

unsigned char info; // bit 0..2 info_a, bit 3..4 info b, bit 5..7 info_c

哪一个是

的更快版本
  • 存储数据
  • 检索数据

2 个答案:

答案 0 :(得分:2)

在大多数典型的现代平台上,struct方式会更快。这是因为单个指令可用于加载或存储单个字节,而子字节加载和存储则需要额外的操作。

当然,如果你有很多次需要一次设置所有三个值,或者一次清除它们,或者你受内存限制(例如你存储了数十亿这些值),那么子字节解决方案将有一个优势。

答案 1 :(得分:1)

如果您有一个这样的实例,那么我认为不会有任何有意义的差异,因为它们都比一个字长。单个char版本可能会变慢,因为你不需要对结构进行一些操作。

如果你在数组和循环中有数百万这些,那么我希望单个字符的更紧凑的数据将减少缓存未命中的数量,这将弥补位操作中的任何微小损失在数据。

但与以往一样,您必须在特定环境中对其进行测试才能确定。