C++ 基于文件的位图API';s

C++ 基于文件的位图API';s,c++,c,C++,C,我想在位图中写入卷上更改的扇区。我不认为使用内存中的位图是好的,因为卷可以 内存非常大,大量的RAM将不断被占用。我认为基于文件的位图(磁盘上文件中的位图)将是最佳的。windows缓存管理器将大大降低性能影响。Windows有很多类可以使用内存位图进行操作 (位数组),但我找不到基于文件的位图的现成实现。 例如,我需要void,它可以在这个文件中设置一些位(从n到k)。A可以写,但我更喜欢使用ready lib。你知道一些吗 用于此的例程、API或LIB?我接受C或C++,用户或内核模式。p>

我想在位图中写入卷上更改的扇区。我不认为使用内存中的位图是好的,因为卷可以 内存非常大,大量的RAM将不断被占用。我认为基于文件的位图(磁盘上文件中的位图)将是最佳的。windows缓存管理器将大大降低性能影响。Windows有很多类可以使用内存位图进行操作 (位数组),但我找不到基于文件的位图的现成实现。 例如,我需要void,它可以在这个文件中设置一些位(从n到k)。A可以写,但我更喜欢使用ready lib。你知道一些吗
用于此的例程、API或LIB?我接受C或C++,用户或内核模式。p> 编辑:既然您已经说过位图的大小是2^32位,只需使用普通分配即可。对于64位进程,分配GB不是问题

首先,我假设您使用的是64位。如果没有,请切换,因为它在处理大文件时简化了很多事情

如果位图大于页面文件中合理存储的大小(>20-50GB),请使用持久内存映射文件,否则只需使用正常分配。内存映射文件具有将数据保存在内存中的优点,但由于该文件被用作单独的页面文件,因此不需要大量分页空间

如果文件足够小,足以容纳您的地址空间(64位128TB),则您可以映射整个文件,而如果文件较大,则您只需映射正在处理的部分


有关如何将文件映射到内存的信息,请参阅:。

您希望位图有多大?@yeso。用户容量可以有多大?ntfs 2^32群集的最大卷大小。因此位图中最多可以有2^32位假定4kb扇区大小和1TB卷大小,“仅”有2.56亿个扇区。如果使用1扇区=1像素,256位颜色的位图将为256MB,32位颜色的位图为1GB。在内存中仍然可以管理。我怀疑是否有任何框架可以有效地处理如此大的位图,但写一个BitMapInfo头,然后转储缓冲区似乎是最有效的解决方案。@Agent\L我真的不认为这里的“位图”指的是图像。@完全展开。不是图像。位数组。我需要在重新启动前保存此位图,内存映射文件是否比正常分配+序列化/去序列化更好?如果我经常随机地从位图中写入/读取,内存消耗将是内存位图中最糟糕的吗?