4

我有一堂苹果

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 个元素吗?我要求澄清一下, 向量可以存储的最大元素数量不取决于存储的实体类型(int 或 double)? (这与向量的当前容量无关!)另外,指向苹果对象的指针的大小是多少(不是询问苹果对象的大小!)?谢谢你。

4

6 回答 6

7

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

vector::max_size()

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

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

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

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

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

于 2011-10-24T10:50:27.490 回答
4

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

于 2011-10-24T10:52:52.850 回答
2

另外,指向苹果对象的指针的大小是多少(不是询问苹果对象的大小!)?

我相信一些语言律师会过来指出这是不正确的,但实际上:32 位构建将使用 32 位指针,因此指向对象的指针是四个字节。在 64 位构建中,每个指针获得 8 个字节。

于 2011-10-24T10:57:23.860 回答
2

如果不受任何资源限制(CPU、内存、时间)的限制,它是向量将不再能够向自身添加任何项目的大小。

由于主要是内存限制,您实际可以存储的数量通常要低得多。

当前容量可以通过调用找到vector::capacity(),如果你想知道你可以在当前设置上拉伸向量多远,然后继续调整向量的大小直到bad_alloc抛出异常)

于 2011-10-24T11:02:34.590 回答
1

我真的可以在该向量中存储 1073741823 个指针,还是这是向量的内存容量?

max_size()告诉你这个实现vector不能处理比​​这个更大的尺寸;如果有足够的可用内存来容纳它们,则可以达到该大小的向量。

可以存储在向量中的实体的最大数量是否取决于实体的类型?如果是,如何计算?

这取决于两者的实现vector,以及它使用的分配器。在实践中,它通常会;您可能会发现它等于numeric_limits<size_t>::max() / sizeof (value_type); 可以在数组中分配的最大字节数除以对象大小。

另外,指向苹果对象的指针的大小是多少(不是询问苹果对象的大小!)?

这取决于你的平台。由于max_size()它是如此之小,我猜您正在使用 32 位平台,在这种情况下,指针将是 32 位(4 字节)。其他平台将有不同的指针大小。

于 2011-10-24T11:07:25.807 回答
0

十六进制(1073741823)='0x3fffffff'

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

于 2011-10-24T10:51:25.133 回答