【问题标题】:Difference between an array and vector related to maximum size?与最大大小相关的数组和向量之间的区别?
【发布时间】:2016-05-10 08:55:08
【问题描述】:

当我在我的 Devcpp 编译器中运行此代码时->

#include<bits/stdc++.h>
using namespace std;
int main()
{
    vector<int> vec;
    for(int i=0;i<100000000;i++)
    vec.push_back(i);
}

它甚至可以在运行时工作。 但是当我运行时->

#include<bits/stdc++.h>
using namespace std;
int arr[1000000000];
int main()
{
    return 0;
}

它给了我链接错误。

只要需要空间,arr和vec都需要相同的空间。那么为什么vec代码在运行时运行得很好,但arr代码甚至无法编译。

【问题讨论】:

  • @dvenkatsagar 不,这没有意义。
  • @dvenkatsagar 这没有意义。
  • @MarcusMüller Jinx。你欠我一杯苏打水。 :)
  • 什么编译器错误?它在 osx 上用 clang 为我编译。

标签: c++ arrays vector


【解决方案1】:

问题在于分配。在第一种情况下,std::vector 默认allocator 使用动态分配,原则上可以根据需要分配尽可能多的内存(当然受操作系统和物理内存量的限制),而在第二种情况下,它使用内存可用于静态分配(从技术上讲,数组具有static storage duration),在您的情况下小于1000000000 * sizeof int 字节。请参阅this 以获得有关 C 程序中各种类型分配的一个很好的答案(这也适用于 C++)。

顺便说一句,避免#include&lt;bits/stdc++.h&gt;,因为它是非标准的。仅包含您需要的 standard 标头。还有一个问题:我认为您不会收到编译时错误,您可能会收到运行时错误。换句话说,代码编译得很好,但无法运行。

【讨论】:

  • @StevenBurnap 我不确定 OP 是否出现编译错误,它可能是运行时错误。将编辑答案。
  • 是的,如果 OP 出现运行时错误,您所说的非常有道理。
  • arr 未在堆栈上定义。它是一个全局对象。
  • @RSahu 错过了它是在函数之外定义的,将编辑,谢谢。
  • @StevenBurnap 你确定吗?全局数据段不是很小吗?在任何情况下,该标准都没有规定任何关于在何处/如何进行分配的内容。 只要索引是整数类型是什么意思?数组的大小必须是整数类型。
【解决方案2】:

好像对象

int arr[1000000000];

对于您的环境来说太大而无法容纳您的程序的全局数据。我没有收到编译时错误,但我的环境中也出现了链接时错误(cygwin/g++ 4.9.3)。

对我来说,将尺寸缩小十分之一。它也可能对你有用。我不知道如何确定可以放入全局数据的对象的最大大小。

堆栈中的可用空间是最小的。
全局数据中的可用空间比这要大。
堆中的可用空间是最大的。

如果您的对象太大而无法放入堆栈,请尝试放入全局数据。
如果您的对象太大而无法容纳全局数据,请使用堆。

【讨论】:

  • int arr[1000000000]; 是一个对象吗?真的吗?
  • @StahlRat,在 C++ 对象模型中,每个变量都是一个对象。
  • C++ 标准的附录 B 将 262144 命名为最大对象大小的指南。如果我理解正确,这意味着对于非动态 int 数组,任何不超过 262144 / sizeof(int) 的元素都应该可以通过高质量的实现。但当然,“这些数量仅作为指导,并不能确定合规性”
  • @StahlRat:虽然对象不是类。它们更像是 ADT(抽象数据类型)。
猜你喜欢
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 2018-03-15
相关资源
最近更新 更多