C++ 指向对象的指针向量 - max_size()

4
我有一个类名为apples。
class apples
{
  private:
      double x;
      double y;
      double z;
  public:
      //some methods
};

我希望将苹果对象的指针存储在向量中。 我这样做是为了在任何文件中创建任何对象并在任何文件中使用任何对象。 我使用以下代码来确定我可以在该向量中存储的最大指针数

int _tmain(int argc, _TCHAR* argv[])
{
vector<apples *> myvector;
cout<<"max :"<<myvector.max_size();
return 0;
}

它给了我:

1073741823

现在,我的问题是:我是否真的能在向量中存储1073741823个指针,还是这是向量的内存限制(即1073741823字节)?

如果有2个向量:

vector<int> A
& 
vector<double> B

A是否可以有1073741823个元素,B也可以有1073741823个元素? 我问这个问题是为了澄清以下事实: vector能够存储的最大元素数量不取决于被存储的实体类型(int或double)? (这与向量当前容量无关!) 此外,指向apples对象的指针大小是多少(不是在询问apples对象的大小!)? 谢谢。

6个回答

7

这是向量存储元素的库限制。

vector::max_size()

返回向量容器可以容纳的最大元素数量。

这不是当前分配给向量的存储空间的数量(可以使用成员vector::capacity获得),而是由于系统或库实现限制可能达到的向量的最大潜在大小。

因此,您不能存储超过它(实际上可能由于系统限制而少于它

换句话说,即使您拥有最好的资源(内存、CPU等)能力,并且您的元素具有最小的大小,您也不能存储超过max_size()的元素。

根据头文件中对max_size()的注释:返回最大可能的%vector的大小。


那是否意味着,无论int和double的内存大小差异,vector<int>或vector<double>都可以有1073741823个元素? - Cool_Coder
如果你有足够的内存,是可以的。但是,vector<double> 会分配比 vector<int> 更多的内存。 - masoud

4

max_size 函数返回 vector 可以容纳的元素数量的上限。这并不意味着 v.resize(v.max_size()) 将成功,它仅仅表示 v.resize(v.max_size() + 1) 将失败。


只要 v.max_size() + 1 不会溢出,当然。 (在调用 v.resize() 之前,溢出会引入未定义的行为。) - James Kanze
@James Kanze,没错 :) 不过没有 UB,1 会被提升为 unsigned int,溢出结果为 0u。(当然,除非 size_t 被定义为 unsigned charunsigned short。) - avakar
@avakar我已经编辑了这个问题。您能否请看一下? - Cool_Coder
@avakar,加法没有未定义的行为。这只是另一个例子,说明在标准库中到处使用size_t是一个糟糕的决定。(当然,无论如何,您都不会从resize获得错误,但向量的大小将不会是您想要的。) - James Kanze

2
此外,一个指向apples对象的指针的大小是多少(不是在询问apples对象的大小!)?
我相信有些语言专家会指出这不正确,但在实践中:32位构建将使用32位指针,因此指向对象的指针为4个字节。在64位构建中,每个指针有8个字节。

2

如果没有受到任何资源限制(CPU、内存、时间)的约束,那么这个向量将无法再添加更多项时所达到的大小就是它的大小。

由于主要受到内存限制,实际可存储的数量通常会大大降低。

可以通过调用vector::capacity()来查找当前容量。如果您想了解在当前设置下可以将向量扩展到多远,则可以不断调整向量大小,直到抛出bad_alloc异常为止。


1
这个 vector 真的可以存储 1073741823 个指针吗?还是说这是 vector 的内存容量? max_size() 可以告诉你,这个 vector 实现无法处理比这更大的大小;如果有足够的内存来容纳它们,那么可以存储最多这么多个元素。
在一个 vector 中能存储的实体数量是否取决于实体类型?如果是,如何计算?
这取决于 vector 的实现和其使用的分配器。实际上通常会这样做;你可能会发现它等于类似于 numeric_limits<size_t>::max() / sizeof (value_type) 的东西;可以在数组中分配的最大字节数除以对象大小。
此外,苹果对象的指针大小是多少(不是在询问苹果对象的大小!)?
这取决于您的平台。由于max_size()太小,我猜您正在使用32位平台,在这种情况下,指针将为32位(4字节)。其他平台将有不同的指针大小。

0

hex(1073741823) = '0x3fffffff'

这看起来像是一些预定义的限制。


@CAD_coding 我认为其他答案已经详细地涵盖了这个问题 - 基本上它是一个理论上的最大值,在实践中由于内存限制你永远无法达到。 - Douglas Leeder
今天我在x64 Ubuntu上的一台几年前自己组装的机器上尝试向一个vector<uint64_t>中添加超过十亿个元素。填满一个向量并不需要太长时间。该机器有12GB内存。 - Steven Lu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接