我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset
I'm using std::bitset and trying to create two arrays std::bitset with size 100,000,000,000
我正在使用std::bitset,我尝试创建两个大小为100,000,000,000的数组std::bitset。 结果,程序只填满了我的 298 MB RAM,但必须填满 ~24 GB。我有 32 GB 内存,现在有 26 GB 可用。当我为 x86 构建代码时,它可以编译并且可以启动,但对于 x64,它向我显示以下内容:错误 C2148:数组的总大小不得超过 0x7fffffff 字节。 如何修复它并且不减小位集数组的大小?
我尝试制作 2 个全局数组。 此外,我已经Microsoft可视化工作室 -> 项目 -> 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 内存使用量;内存使用情况显示使用"兆字节"(基数为 2,而不是基数 10,因此 KiB == 1024 和 MiB == 1048576(,这使得每个数组消耗略低于 145 MiB,其中两个阵列总共消耗 290 MiB,为程序的其余部分留下 8 MiB(这似乎是合理的(。
如果它实际上在x64上因该错误而死亡,那么您就陷入困境了;无论谁实现了您的std::bitset
(或任何支持它的数据结构,例如std::array
( 即使在 64 位系统上,也将其限制为0x7fffffff
字节,这会将您限制在大约 170 亿位或更少的std::bitset
。您唯一的选择是为您的标准库找到不同的提供程序,或者自己重新实现它。
更新:显然您使用的是Windows,静态数据大小的限制为2GB(0x7fffffff字节(,即使在64位Windows上也是如此; Windows Portable 可执行文件格式(由.exe
和.dll
文件使用(为每个部分使用32位偏移量和长度,即使对于64位可执行文件也是如此。通过使用全局std::bitset
,你尝试在映像中存储 25 GB 的静态数据,这将不起作用。如果您像以前一样增加堆栈储备大小,将它们移动到堆栈(在main
体内声明它们非static
(可能会起作用,但依赖这么大的堆栈仍然是一个坏主意。我建议简单地动态分配bitset
(例如auto mas = std::make_unique<std::bitset<100000000000>>()
(,或者找到一种更好的方法来用更小的bitset
做到这一点。
- 如何打印大于"无符号长长"的"std::bitset"的十进制值?
- 关于 std::bitset 构造函数的几个问题?
- 如何以滑动窗口方式从 std::bitset 读取位并将它们转换为 int?
- 在哪里可以找到 std::bitset 的数据成员?
- 对于std::bitset,是否有一个ffs()等价物
- 移动 std::bitset<N> 是否超过 N 个位置未定义的行为?
- 我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset
- OMNeT++ cPacket as std::bitset 以应用 Reed-Solomon 编码
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 将字符数组转换为 std::string 以传递到 std::bitset seg 错误
- std::bitset 哈希函数算法
- 与STD :: BITSET的工会成员的结构填充
- 为什么 MSVC 在实现 std::bitset::count 时不使用 __popcnt?
- 如何在数字大于类型 size_t 的最大数量时使用 std::bitset
- 从STD :: BITSET ::操作员[]扣除模板
- 重载 std::bitset 的移位运算符
- 为什么 std::bitset<5>{}[0] 不是 constexpr?
- 我可以在 OpenACC 中使用 std::bitset 的函数吗?
- 在编译时初始化 c++ std::bitset
- 为什么 std::bitset 只支持整型数据类型?为什么不支持浮点数?