当我在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代码甚至不能编译。
答案 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。