2

我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset。结果,程序仅填充了我的 RAM 的 298 MB,但必须填充〜 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 呢?我的代码检查整个数组,并在某一时刻停止。

4

1 回答 1

4

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

如果缩小bitset. 如果它声称可以运行,则可能是另一个错误;它会被截断100_000_000_000以适应 32 位size_t,而是创建一个std::bitset<1215752192>,它只需要约 150 MB 的内存,不会造成任何问题。这可以解释您观察到的 298 MB 内存使用情况;内存使用显示使用“mebibytes”(base-2,而不是 base-10,因此 KiB == 1024 和 MiB == 1048576),这使得每个阵列消耗不到 145 MiB,其中两个总共消耗 290 MiB,剩下 8 MiB 用于您程序的其余部分(这似乎是合理的)。

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

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

于 2019-09-11T18:18:36.413 回答