关于C++记忆的事情
something about memory in C++
可能的重复项:
大型阵列大小的分段错误
运行程序时发生分段错误。
#include<iostream>
using namespace std;
int main(){
int x[2000][2000];
int y;
cin >> y;
}
但是,当我运行以下两个程序时,它们就可以了。
#include<iostream>
using namespace std;
int x[2000][2000];
int main(){
int y;
cin >> y;
}
和
#include<iostream>
using namespace std;
int main(){
int x[2000][2000];
int y;
}
我很困惑。谁能告诉我为什么?
恭喜,您发现了堆栈溢出。
在第一个示例中,大型数组x
将y
推到堆栈的末尾,因此访问它会使程序崩溃。 (2) 不会崩溃,因为您声明的大数组位于数据段中,因此不在堆栈上;(3) 不会崩溃,因为您实际上并没有访问堆栈末尾的内存(您已声明它,但没有读取或写入它)。
在第一个示例中,您尝试在堆栈上分配 20,000*20,000*4 字节(假设为 32 位整数)。 这相当于大约 16MB 的数据,这比编译器分配给您的堆栈大小(通常约为 1MB)要多,因此您耗尽了(堆栈)内存
在第二个示例中,编译器将内存分配给x
在单独的全局空间(不在堆栈上),该空间有足够的空间来容纳它。
第三个示例比较棘手,因为它似乎应该导致与第一个示例相同的情况,但编译器可能优化了函数,因为它认为该函数中没有进行有意义的工作(因此没有为局部变量分配内存)
相关文章:
- 松弛原子与无同步情况下的记忆连贯性
- 递归函数有效,但无法记忆
- 如何将记忆应用于此递归函数?
- 共享记忆:让我们谈谈它的特殊性
- 为什么nlohmann不释放记忆
- CPP 中的瓦尔格林德和记忆泄漏:"Conditional jump or move depends on uninitialised values"
- C++17 多态记忆资源不起作用
- 我是否漏了记忆?
- 关于记忆后这种递归关系的时间复杂度
- 记忆栅栏和记忆屏障是一样的吗
- 使用记忆在 C++ 中实现 Knapstack
- 无论如何可以将webm / mp4文件编译/记忆为.exe程序吗?(C++)
- 如何在硬币兑换中添加记忆
- 动态记忆的删除是如何真正起作用的
- C++遗传,记忆问题
- 使用未声明的标识符"nothrow";你是说"扔"吗?记忆
- Qt驱动器下拉列表仅列出USB记忆棒
- 我找不到瓦尔格林德告诉我的记忆链接
- DFS + 记忆解决方案在 LeetCode 上获取 TLE
- 根据呼叫位置进行记忆