C++ I';我正在使用std::bitset并尝试创建两个大小为10000000000的数组std::bitset

C++ I';我正在使用std::bitset并尝试创建两个大小为10000000000的数组std::bitset,c++,windows,std-bitset,C++,Windows,Std Bitset,我正在使用std::bitset,并尝试创建两个大小为10000000000的数组std::bitset。 结果,该程序只能填充298MB的RAM,但必须填充约24GB。我有32 GB内存,现在26 GB是免费的。当我为x86构建代码时,它会编译并启动,但对于x64,它会显示以下信息:错误C2148:数组的总大小不得超过0x7fffffff字节。 如何修复它而不减少位集数组的大小 我尝试制作了两个全局数组。 另外,我在Microsoft visual studio->project->name\

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

我尝试制作了两个全局数组。 另外,我在Microsoft visual studio->project->name\u project properties->configuration properties->linker->system->Stack Reserve Size中设置了25000000(我想一定有KB,所以我想我已经设置为~25 GB)

..//其他图书馆
#包括
位集mas;
std::位集a1;
int main(){…/*使用数组*/…}
我想用巨大的std::位集数组运行代码


UPD:对于x86可以,但是对于x64呢?我的代码检查整个数组,并在一瞬间停止。

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

如果不收缩
位集,程序无法在32位系统上运行。如果它声称运行,则可能是另一个错误;它将截断
100_000_000_000
以适应32位
size\t
,创建一个
std::bitset
,它只需要约150 MB的内存,不会造成任何问题。这可以解释你观察到的298MB的内存使用率;内存使用情况显示使用“mebibytes”(base-2,而不是base-10,因此KiB==1024和MiB==1048576),这使得每个数组的消耗量略低于145 MiB,其中两个数组总共消耗290 MiB,剩下8 MiB用于程序的其余部分(这似乎是合理的)

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


更新:显然您使用的是Windows,静态数据大小限制为2GB(0x7fffffff字节);Windows可移植可执行文件格式(由
.exe
.dll
文件使用)对每个部分使用32位偏移量和长度,甚至对64位可执行文件也是如此。通过使用global
std::bitset
s,您试图在映像中存储25 GB的静态数据,这是行不通的。如果您像以前那样增加堆栈保留大小,那么将它们移动到堆栈(在
main
的主体内声明它们为非
static
)可能会起作用,但依赖如此大的堆栈仍然是个坏主意。我建议只需动态分配
位集
(例如
auto-mas=std::make_unique()
),或者找到一种更好的方法,在32位构建方面使用更小的
位集

。32位寻址仅允许2 GiB RAM。考虑到数据的大小,这是不可能的。如果这是运行,一些非常奇怪的事情正在进行中。你确定这是尺寸吗?使用
sizeof
检查较小的分配。
mas
a1
不在堆栈上,因此堆栈大小不是问题。我不知道如果您保留25 GB的堆栈会发生什么,但这听起来是个糟糕的主意。值
10000000000
不适合32位无符号整数。因此,32位构建可能溢出,使您的
1215752192
的大小小得多。好的,但是x64呢?@kileatb我想我们需要ir命令来说明更多内容。我必须通过考试,因为我只有16GB可供使用。把我的克雷留在我的另一条裤子里。@kileatb:你的错误消息告诉你那里的问题;看起来您的标准库实现者对
std::bitset
或它使用的存储实现设置了严格的
0x7fffffff
字节限制,因此您被卡住了;您需要不同的实现,或者来自不同的编译器编写器,或者自己重新实现。@ShadowRanger我可以更改我的平台的最大大小,还是必须创建不同的实现?@kileatb VC++对数组的大小有一个硬编译器限制。这不是标准库产生的错误,而是实际的编译器在抱怨。我认为这是由于Windows技术限制了进程的加载方式。“我怀疑在不完全改变平台的情况下,你能否绕过这个问题。”显然,基里亚特说。即使将
位集
拆分为更小的位集,也无助于您。您可以尝试动态分配它们(最多8TB)。
... // other libraries
#include <bitset>

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

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