堆栈内存 /STACK

Posted

技术标签:

【中文标题】堆栈内存 /STACK【英文标题】:Stack Memory /STACK 【发布时间】:2012-06-03 22:56:46 【问题描述】:

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

我想避免经常需要从输入文件中读取数据的情况,我想知道在出现问题之前我可以在向量中存储多少值。 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 中是否有任何方法可以准确监控当前正在使用的堆栈和堆内存量?

有什么办法可以防止在这种情况下不断读取输入文件吗?

【问题讨论】:

您正在处理的文件有多大?如果大小合理,我只需将整个内容加载到 RAM 中并从那里开始工作。 输入文件仍在修改/添加中,但最后我希望它可能有 350,000 个整数。一次将整个内容读入 RAM,是指动态分配缓冲区,然后调用 ifstream 的 get 吗? 1Meg 文件,我可能只是将整个文件读入一个缓冲区并完成我的工作。如果许多其他用户正在动态更改文件,那么特定于操作系统的解决方案(例如内存映射文件读取)可能会更好。在性能方面,单次 1 Meg 读取将比大量 4 字节随机读取快得多。 【参考方案1】:

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

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

编辑

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于堆栈内存 /STACK的主要内容,如果未能解决你的问题,请参考以下文章

关于JS堆栈与拷贝

关于JS堆栈与拷贝

c语言关于栈中内存无法使用的问题

堆栈和队列

堆栈方法区直接内存

a堆内存与栈内存异同(Java Heap Memory vs Stack Memory Difference)