C++ 强制转换大小\u t以允许std::vector中有更多元素

C++ 强制转换大小\u t以允许std::vector中有更多元素,c++,C++,我需要将大量元素存储在32位的std::vector(大于unsigned int允许的2^32-1)中。据我所知,这个数量受到std::size\u t无符号int类型的限制。我可以通过强制转换为无符号长字符来更改此std::size\u t吗?它能解决问题吗 如果这是不可能的,假设我编译为64位。不做任何修改就能解决问题吗?size\u t是一种可以容纳任何可分配内存块大小的类型。因此,您无法分配超出大小\u t的内存,因此无法以任何方式存储更多的元素 在64位中编译将允许它,但要意识到数组

我需要将大量元素存储在32位的
std::vector
(大于unsigned int允许的2^32-1)中。据我所知,这个数量受到
std::size\u t
无符号int类型的限制。我可以通过强制转换为无符号长字符来更改此
std::size\u t
吗?它能解决问题吗


如果这是不可能的,假设我编译为64位。不做任何修改就能解决问题吗?

size\u t是一种可以容纳任何可分配内存块大小的类型。因此,您无法分配超出
大小\u t
的内存,因此无法以任何方式存储更多的元素

在64位中编译将允许它,但要意识到数组仍然需要放入内存中。232是40亿,所以你需要超过4*sizeof(element)GiB的内存。超过8 GiB的RAM仍然很少见,因此看起来不合理

我建议用中的向量替换向量。它使用外部存储,因此向量不受RAM数量的限制。该库声称可以轻松处理TB级的数据


(编辑)迂腐的注释:
size\u t
需要保持最大单个对象的大小,而不一定是所有可用内存的大小。在分段内存模型中,当每个对象必须生活在单个段中时,它只需要调整偏移量,但对于不同的段,可以访问更多内存。甚至可以在x86上使用“长”内存模型PAE。但是,我还没有看到任何人真正使用它。

A
vector
可能是不适合您的数据结构。它需要存储在单个内存块中,内存块的大小受
size\u t
的限制。您可以通过为64位系统编译来提高这一点,但是您不能在32位系统上运行,这可能是一个要求


如果您不需要
vector
的特定特性(特别是O(1)查找和连续内存布局),另一种结构,如
std::list
可能适合您,它没有大小限制,除了计算机可以物理处理的内容,因为它是一个链表,而不是一个方便包装的数组。

有很多事情要说

首先,分别是关于32位系统和64位系统上的
std::size\u t
的大小。这是标准中关于
std::size\u t
(§18.2/6,7)的规定:

6类型
size\u t
是一种实现定义的无符号整数类型,其大小足以包含大小 以任何对象的字节为单位

7[注:建议实现为
ptrdiff\u t
size\u t
选择其整数的类型 转换秩(4.13)不大于有符号长整数的秩,除非需要更大的值 包含所有可能的值。-结束注释]

由此可知,
std::size\t
在32位系统上的大小至少为32位,在64位系统上的大小至少为64位。它可能更大,但这显然没有任何意义

第二个,关于类型转换的想法:要想实现这一点,即使在理论上,您必须在
std::vector
本身的实现中转换(或者更确切地说:重新定义)类型,无论它发生在哪里

第三个,当你说你需要这个“32位”的超大向量时,这是否意味着你想在32位系统上使用它?在这种情况下,正如其他人已经指出的,您想要的是不可能的,因为32位系统根本没有那么多内存

但是,fourth,如果您希望在64位机器上运行程序,并且仅使用32位数据类型来表示元素的数量,但可能使用64位类型来表示以字节为单位的总大小,则
std::size\u t
不相关,因为它用于表示元素的总数,和单个元素的索引,但不是以字节为单位的大小

最后,如果您使用的是64位系统,并且希望使用类似于
std::vector
的极端比例的东西,那当然是可能的。具有32 GB、64 GB甚至1 TB主内存的系统可能并不十分常见,但绝对可用

然而为了实现这样的数据类型,在一个连续块中简单地分配千兆字节的内存通常不是一个好主意(这是std::vector所做的),原因如下:

  • 除非在初始化时一次性确定向量的总大小,否则向量将被调整大小,并且很可能在添加元素时多次重新分配。重新分配一个非常大的向量可能是一个耗时的操作[我已将此项目作为编辑添加到我的原始答案中。]
  • 操作系统将很难提供如此大的未分段内存,因为其他并行运行的进程也需要内存。[编辑:正如评论中正确指出的,这在当今使用的任何标准操作系统上都不是一个问题。]
  • 在非常大的服务器上,您还拥有数十个CPU和典型的NUMA类型的内存架构,在这些架构中,显然最好使用相对较小的内存块,并让多个线程(可能每个线程都运行在不同的核心上)并行访问向量的各个块
结论

A)如果您使用的是32位系统,并且希望使用如此大的向量,那么使用基于磁盘的方法(如@JanHudec建议的方法)是唯一可行的方法

B)如果