堆栈溢出和静态数组

时间:2014-02-25 19:57:54

标签: c++ memory-management operating-system

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

  1. 静态和动态数组之间是否有任何性能差异,不包括内存分配所需的时间?

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

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

1 个答案:

答案 0 :(得分:2)

  

静态和动态数组之间是否有任何性能差异,不包括内存分配所需的时间?

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

  

据我所知,堆栈只有几MB。为什么堆栈有限?为什么有堆栈和堆而不是一个存储内存的地方?

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

用于堆栈或堆的内存量可以由构建环境改变,也可以由OS改变。如果程序需要更多内存,它可以向操作系统询问更多内容(但操作系统可能使用分页和虚拟内存)。

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

  

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

不,不应动态分配不会改变大小且小的数组。较小的数组可以分配为局部变量;较大的可能想要位于filescope(自动变量)中。根据编译器或操作系统设置的限制,可能必须在动态内存或OS内存中分配大量数组。

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

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