在C++中高效读写比特流

3
我正在编写一个数据压缩库,需要编写一系列整数编码(使用各种整数编码器)并将其存储在内存中,并在以后读取它们。
整数编码必须连续存储。由于它们的位数通常不是8的倍数,在内存中无法对齐。
简而言之,我需要类似以下函数的东西:
unsigned int BitReader::read_bits(size_t bits);
unsigned int BitWriter::write_bits(unsigned int num, size_t bits);
void BitWriter::get_array(char** array);
BitReader::BitReader(char *array);

由于我需要在一个非常紧密的循环中调用这些函数,所以效率至关重要(特别是在读取方面)。

你知道一些能够满足我的需求的C++库吗?谢谢。


你不能直接读写硬盘上的单个位,因此你的位读取器必须进行一定的缓冲。 - Bo Persson
@Bo Persson:这不是问题,我只是想要一个能在内存中完成所有操作并让我获取整个支持数组的东西,这样我就可以将它写入内存中了。 - akappa
我会尝试一下,看看它的表现如何。我无法猜测bitset的性能是否足够适合您的用例。 - Karel Petranek
1
你没有定义你要寻找什么样的“效率”,但看起来你担心原始性能。在这种情况下,我建议:先停下来!用最明显和可维护的方式编写代码,确定其性能,然后对那些阻碍可接受性能的部分进行剖析和优化。(我敢打赌,这些部分与你在此处考虑的问题毫不相关。)谷歌“过早优化”并获得启迪。 - Nicholas Knight
Boost对于仅进行位读取来说太过庞大了。 - MarcusJ
显示剩余6条评论
2个回答

0
如果效率是您唯一的要求,那么获取数据存储的地址并直接将其写入存储即可。然后在恢复时分配相同的存储空间并执行反向操作。这很简单、快速,而且没有学习曲线。

我需要高效地从存储在内存中的比特流中连续读取单个比特,而不是存储并读取全部内容。 - akappa

-1

尽管对于大量数据而言效率不高,但打开流(stream)以实现输入/输出是最有效的。流提供了一种可移植的读写操作方式,这就是为什么您可以在内存或磁盘中打开流的原因。如果您想控制磁盘本身的流,我建议使用 _bios_disk 函数,可以通过谷歌“_bios_disk”获取更多信息。


这并不正确。我不记得为什么将其标记为“已接受”,但我不再同意当时的想法了 ;) - akappa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接