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

C++ 访问一个字节中的结构或位的子集是否更快?,c++,c,performance,C++,C,Performance,假设我有三部分信息,它们可以作为字节的一部分存储 信息a的长度为3位 信息长度为2位 信息长度为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 第二个实现是 struct info

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

  • 信息a的长度为3位
  • 信息长度为2位
  • 信息长度为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
第二个实现是

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
那么,哪一个版本的速度更快

  • 存储数据
  • 检索数据

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


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

如果您有一个这样的实例,那么我认为不会有任何有意义的区别,因为它们的长度都小于一个单词。单字符版本可能会更慢,因为您必须执行一些不需要对结构进行的位操作

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


但和以往一样,您必须在特定的环境中测试它才能确定答案。

对此没有明确的答案。如果您考虑的是一个特定的平台,请编写选项和基准测试。您可以编写一个简单的测试程序来测试这一点。我的直觉告诉我,非字大小的访问将比字大小的访问慢。这取决于特定CPU指令集中的很多事情。它能设置单个位吗?它能在给定对齐要求的类型(例如32位)上更快地工作吗?等等。在没有特定系统的情况下讨论这个问题是没有意义的。如果缓存是相关的,那么数据压缩可能是一个优势。您说过存储和检索数据。你是说把这些记录写入磁盘吗?或者你的意思是作为某些代码循环的一部分访问内存中的子值?这完全取决于体系结构和周围的代码。例如,在ARM上,使用位域指令并将所有数据保存在单个寄存器中(单个/无内存访问),位域可以更快。