C++ 在c+中将字节流拆分为位+;

C++ 在c+中将字节流拆分为位+;,c++,byte,bit,C++,Byte,Bit,我的程序将获得一个字节流,当前来自一个将使用二进制模式istream读取的文件。为了使用数据,我需要在程序的后面使用各个位。目前有三件事我还不确定,从文件中读取信息,处理它,并存储它以备将来使用。处理是我最不确定的部分,另外两个是小问题 目前正在使用二进制istream接收数据,有没有更快的方法接收数据?对于存储数据,我将使用bool向量,因为编译时不知道大小,并且它可以扩展到几MB的数据,有没有更好的方法来存储数据?如果这对存储器很重要,那么在需要位之前,还有另一个进程可能会使用相对大量的内存

我的程序将获得一个字节流,当前来自一个将使用二进制模式istream读取的文件。为了使用数据,我需要在程序的后面使用各个位。目前有三件事我还不确定,从文件中读取信息,处理它,并存储它以备将来使用。处理是我最不确定的部分,另外两个是小问题

目前正在使用二进制istream接收数据,有没有更快的方法接收数据?对于存储数据,我将使用bool向量,因为编译时不知道大小,并且它可以扩展到几MB的数据,有没有更好的方法来存储数据?如果这对存储器很重要,那么在需要位之前,还有另一个进程可能会使用相对大量的内存

最后一个问题,也是给我带来最大麻烦的一个问题,是如何将字节分割成位,因为这将是一个循环,有大量的数据,我希望这是尽可能有效的。第一个想法,也是我目前最喜欢的一个,是使用逐位&检查位是否已设置,然后通过比较来设置bool

bitbool = (byte&128) != 0
下一种方法是右移位,然后左移位以保留最高有效位,然后移位以保留两个最高有效位,并使用前一种方法隔离第二个最高有效位,但是我认为这将比前一种方法效率更低

最后一种方法是使用8个宽的位集转换字节,然后读取位并设置布尔值。我不确定比特集,因为我以前从未使用过它们,尽管在我的研究之后,似乎可以将它们用于此目的,但我不确定它的效率如何

目前正在使用二进制istream接收数据,有没有更快的方法接收数据

有更快的方法将数据从文件中获取到内存中,但大多数方法都是特定于平台的,需要操作系统调用或访问硬件

从文件中读取数据的关键是保持硬盘旋转。这意味着以最少的请求量读取尽可能多的数据。使用
std::istream::read
方法和大缓冲区

您的程序执行速度可能低于硬盘的数据传输速度。在这种情况下,建议使用多个执行线程。一个线程将数据读入缓冲区。另一个线程从缓冲区中取出数据并进行处理。可能需要额外的缓冲器来调整速度差。研究“双缓冲技术”

如何将字节拆分为位

对于大多数处理器,没有快速的方法来测试或提取位。通常,旋转位时执行速度会减慢

编写代码,然后打印出位旋转函数的汇编语言。这将指示编译器如何生成代码

保存汇编语言列表。接下来,将编译器选项的大小设置为“高”。查看函数的汇编语言。与原始列表进行比较。接下来,将编译器选项设置为高速。与原始列表进行比较。选择你认为最好的版本。如果您精通平台处理器的汇编语言,请使用编译器的汇编语言并对其进行优化

其他优化
首先,配置文件您的代码。确定瓶颈在哪里。在大多数情况下,瓶颈不在你认为的地方。瓶颈代码是开始优化的地方

尝试重新设计代码。这通常会产生最高的性能增益。
例如,设计代码以减少函数调用、开关、
if
语句和循环。所有这些都包含跳跃或分支,这会减慢处理速度。最快执行的想法不包含跳转

重新设计代码以更高效地使用数据缓存。例如,如果有4个数组,则将其更改为一个包含4个变量的结构数组:
使用不当:

更好的使用:


有关更多提示,请在StackOverflow中搜索“[c++]优化”。

您真的需要在执行过程中减少微秒吗?如果是这样,您可以使用编译器选项发出汇编代码,并比较为每个变量生成的代码。或者写下这两个选项并计时。CPU缓存未命中会严重降低本来是最佳代码的执行速度。感谢您的建议,正是布尔向量减慢了我的代码切换到字符向量的速度,使进程运行速度提高了4倍,尽管它占用了8倍的内存。
  int a[10240], b[10240], c[10240], d[10240];
  struct Items
  {
    int a, b, c, d;
  }
  Item array[10240];