c++ - 我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset

标签 c++ windows std-bitset

我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset。 结果,程序只占用了我的 298 MB RAM,但必须填充 ~24 GB。我有 32 GB RAM,现在 26 GB 是免费的。当我为 x86 构建代码时,它会编译并可以启动,但对于 x64,它会显示以下内容:错误 C2148:数组的总大小不得超过 0x7fffffff 字节。 如何修复它并且不减少位集数组的大小?

我尝试创建 2 个全局数组。 另外,我已在 Microsoft Visual Studio -> 项目 -> name_project 属性 -> 配置属性 -> 链接器 -> 系统 -> 堆栈保留大小中设置为 25,000,000 (我认为必须有 KB,所以我认为我已设置为〜 25 GB)。

... // other libraries
#include <bitset>

std::bitset <100000000000>mas;
std::bitset <100000000000>a1;

int main() {.../* work with the arrays */...}

我想使用巨大的 std::bitset 数组运行代码。

UPD:对于 x86 没问题,但是对于 x64 呢?我的代码检查整个数组并在某一时刻停止。

最佳答案

std::bitset必须至少(大多数实现使用最小值)每八位使用一个字节来存储。对于 1000 亿位,这意味着每个位集需要约 12.5 GB 内存。问题是,在 32 位系统上,整个程序的最大虚拟内存大小最多为 4 GB。其中一些被进程的内核内存预留占用,因此您可能只有 2 GB 的虚拟地址空间可供使用;您正尝试使用六倍的量。

如果不缩小bitset,您的程序无法在32位系统上运行。 。如果它声称可以运行,则可能是另一个错误;它将被截断 100_000_000_000适合 32 位 size_t ,创建 std::bitset<1215752192>相反,这只需要约 150 MB 的内存,不会造成任何问题。这可以解释您观察到的 298 MB 内存使用情况;内存使用情况显示使用“mebibytes”(基数为 2,而不是基数 10,因此 KiB == 1024 且 MiB == 1048576),这使得每个数组消耗略低于 145 MiB,其中两个数组总共消耗 290 MiB,剩下 8 MiB 用于程序的其余部分(这看起来很合理)。

如果它实际上在 x64 上因该错误而死掉,那么您就陷入困境了;谁实现了你的 std::bitset (或支持它的任何数据结构,例如 std::array )将其限制为 0x7fffffff即使在 64 位系统上也是如此,这会将您限制为 std::bitset大约 170 亿位或更少。您唯一的选择是为您的标准库找到不同的提供者,或者自己重新实现它。

更新:显然您使用的是 Windows,静态数据大小的限制为 2GB(0x7fffffff 字节),even on 64 bit Windows ; Windows 可移植可执行文件格式(由 .exe.dll 文件使用)对每个部分使用 32 位偏移量和长度,即使对于 64 位可执行文件也是如此。通过使用全局std::bitset s,您尝试在图像中存储 25 GB 的静态数据,这是行不通的。将它们移至堆栈(在 static 的主体内声明它们为非 main )如果您像您一样增加堆栈保留大小,可能会起作用,但依赖它仍然是一个坏主意这么大的一叠。我建议简单地动态分配 bitset (例如 auto mas = std::make_unique<std::bitset<100000000000>>() ),或者找到更好的方法来使用较小的 bitset 来做到这一点.

关于c++ - 我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57894642/

相关文章:

c++ - 如何将 C++ 位集中的位范围子集转换为数字?

c++ - Sun Studio C++ "is not terminated with a newline"警告 - 如何抑制?

Cordova 中的 Windows 桌面支持

c++ - 从字符串中提取数字/数字范围的复杂算法

windows - 如何在用户登录 Windows 之前运行程序?

C# 从注册表中获取 SystemRestore 的状态

c++ - 将枚举类与 std::bitset 一起使用

c++ - 在编译时初始化非常大的 C++ std::bitset

采用继承类的 C++ 非类型模板参数

c++ - 谁在 + 运算符中删除了复制的实例? (c++)