c++ - 堆栈溢出和静态数组

标签 c++ memory-management operating-system

我不确定我是否理解堆栈的工作原理...

  1. 除了内存分配所需的时间之外,静态数组和动态数组之间是否存在性能差异?

    char* data = (char*)malloc(100);
    char data[100];
    
  2. 据我了解,堆栈只有几 MB。为什么堆栈有限?为什么有栈和堆而不是一个地方来存储内存?

  3. 所有数组都应该动态分配吗?例如,在堆栈上放置一个大小为 1KB 的数组,这是一个好主意吗?

最佳答案

Is there any performance difference between static and dynamic arrays, excluding the time needed for memory allocation?

性能差异在于初始化和阵列容量的任何更改。就元素访问而言,可以随机访问的数组大约是最快的容器。

From what I understand stack is only a few MB. Why is the stack limited? Why have stack and heap and not a single place to store memory?

堆栈、动态和程序内存是有限的。计算机没有无限的内存大小。

专用于堆栈或堆的内存量可以通过构建环境甚至操作系统来更改。如果程序需要更多内存,它可以向操作系统请求更多内存(但操作系统可能使用分页和虚拟内存)。

由于变量和数据具有不同的生命周期,因此存在不止一种类型的内存区域。它们也可能有不同的尺寸。

Should all arrays be allocated dynamically? For example, having one array with size 1KB on stack, is it a good idea?

不,分配大小不变且较小的数组不应动态分配。较小的数组可以分配为局部变量;而较大的可能希望位于文件范围(自动变量)中。根据编译器或操作系统设置的限制,可能必须在动态内存或操作系统内存中分配大型数组。

此外,动态分配常量值数组(例如菜单文本或查找表)是没有意义的。这些可以放置在只读内存区域或与可执行文件相同的空间中。

是否有理由需要限制数组分配的灵活性? (请记住,有很多不同的应用程序,从嵌入式到桌面。)

关于c++ - 堆栈溢出和静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22024821/

相关文章:

c++ - 是否有适用于 C++ 的跨平台命令行库?

java - 尝试通过 python 脚本启动 Minecraft 服务器时出现内存问题

iphone - 为什么这个NSMutableSet不会泄漏内存

multithreading - 内核线程 native 线程os线程

c++ - 如果编译后的源代码特定于编译时所使用的硬件,我们该如何分发?

c++ - 获取 SQLite 结果中的列数

加号运算符的 C++ 重载

android - 通过 Intent 传递可分割对象的实例是否会泄漏内存?

operating-system - MS Windows 有什么样的内核?

c++ - Microsoft Visual Studio ~ C/C++ Runtime Library ~ 静态/动态链接