C++在局部变量的内存上是否有上限
Does C++ have an upper bound on the memory of a local variable?
我有一个程序需要启动一个具有100M +条目的unordered_map<int,int>
。只要机器有足够大的内存,我们就可以声明一个我们想要的局部变量,这是真的吗?或者即使机器有 128GB 等巨大内存,局部变量的大小也有一些(可调(上限?我知道unordered_map
内存开销很大。
我之所以担心,是因为我在运行 JAVA 程序时遇到了这样的问题。我知道JAVA有JVM,而C++不需要它。
我正在具有 128GB 内存的 Linux 机器上开发代码,但潜在客户可能会在具有 8GB 内存的 Linux 机器上使用它。
代码如下所示:
int func() {
unordered_map<int,int> mp;
for (int i=0; i<INT_MAX; i++) mp[i] = i-1;
return mp.size();
}
这篇文章讨论了堆内存,但我在这里仍然有点困惑。
根据我作为程序员C++的经验,你不能声明你想要的本地数组。局部变量存储在"调用堆栈"中。但是在您的情况下,当您使用 STL 时,应该没有问题,因为使用 STL 数据结构时,只有少数属性存储在"调用堆栈"中,并且数据结构的元素存储在堆中。
c++ 可以使用操作系统愿意为单个进程提供的内存量。对于 32 位进程,这不超过 4GB,在 64 位进程上,它将是机器上的总可用内存和交换空间(有限制,但我不认为当前的机器会遇到它们(。
相关文章:
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 我在二维向量中是否正确分配了内存
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 添加静态constexpr成员是否会更改结构/类的内存映射
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- 内存围栏是否涉及内核
- 我是否生成线程并导致内存泄漏?
- 公共/私有/受保护是否会更改内存中结构的排列?
- 是否可以通过每次在内存中仅保存一个平铺来处理完整的平铺 tiff 图像?
- 在没有动态内存的世界中,我是否需要虚拟析构函数?
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 是否可以使用分配器对象来释放另一个分配器分配的内存?
- 释放动态分配的内存时是否需要执行此额外步骤
- 当另一个数组是内存集时,内存集是否会更改数组长度?
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 当新的故障时,是否有必要留出一些紧急内存?
- 如何检查链表是否内存不足/已满