数组和向量之间的差异与最大大小有关吗?

时间:2016-02-01 19:16:42

标签: c++ arrays vector

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

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

即使在运行时也能正常工作。 但是当我跑 - &gt;

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

它给我链接错误。

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

2 个答案:

答案 0 :(得分:9)

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

顺便说一句,请避免使用#include<bits/stdc++.h>,因为它不合标准。仅包含您需要的标准标头。还有一个问题:我不认为你得到编译时错误,你可能会遇到运行时错误。换句话说,代码编译得很好,但无法运行。

答案 1 :(得分:3)

似乎是对象

int arr[1000000000];

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

为我减少十分之一的工作量。它也可能对你有用。我不知道如何确定适合全局数据的对象的最大大小。

堆栈中可用空间的大小最小 全球数据中的可用空间大于该数据 堆中的可用空间是最大的。

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