2

对于我正在处理的程序,我经常需要从包含数十万个整数的文本文件中读取输入。目前,我正在读取一些值并将它们存储在一个向量中。每当我需要的值不在向量中时,我就会再次从输入文件中读取并清除旧值,以便为我当前正在读取的值腾出空间。

我想避免经常需要从输入文件中读取的情况,我想知道在出现问题之前我可以在向量中存储多少值。max_size() 返回 1073741823,所以我想我可以存储这么多元素,但我想知道该内存在哪里使用,以及拥有这么大的向量是否是个好主意。

当您这样创建向量时:

int main(){
std::vector<int> vec;
vec.push_back(3);
vec.push_back(4);

return 0;
}

该向量现在是否使用堆栈内存?由于您的向量包含 2 个整数,这是否意味着正在使用 8 个字节的堆栈内存?

根据 MSDN 文档:

对于 x86 和 x64 机器,默认堆栈大小为 1 MB。

这似乎并不像很多内存。什么是您想要增加堆栈内存的情况示例?Visual Studio 中是否有任何方法可以准确监控当前正在使用的堆栈和堆内存量?

在这种情况下,我能做些什么来防止从输入文件中不断读取吗?

4

2 回答 2

4

该向量现在是否使用堆栈内存?

vec 对象在堆栈上,但随着它的增长,它会在内部在堆上分配内存

编辑

此外,您可以尝试使用内存映射文件,而不是读取所有文件并将其存储在向量中。据我了解(我自己没有使用过它们),您将受益于内核模式下的页面缓存和文件读取(因为操作系统将按需管理文件的加载)。

请注意,这只是关于在哪里进行调查的建议(我认为这可能是合适的,但我对内存映射文件不够熟悉,无法告诉您更多信息)

于 2012-05-29T17:29:56.400 回答
0

vector将元素存储在堆中,而不是堆栈中。你是否真的应该分配那么多堆内存是另一回事,但你不会破坏你的堆栈。

于 2012-05-29T17:30:30.657 回答