为什么我应该在"char bigchar [1u << 31 - 1];"时使用malloc()工作得很好?

Sam*_*son 7 c arrays malloc static

在静态数组上使用malloc(除了NULL返回失败)有什么好处?以下程序将占用我所有的ram并且只有在取消注释循环时才开始填充交换.它没有崩溃.

...

#include <stdio.h>

unsigned int bigint[ 1u << 29 - 1 ];
unsigned char bigchar[ 1u << 31 - 1 ];

int main (int argc, char **argv) {
  int i;
/*   for (i = 0; i < 1u << 29 - 1; i++) bigint[i] = i; */
/*   for (i = 0; i < 1u << 31 - 1; i++) bigchar[i] = i & 0xFF; */

  getchar();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

...

经过一些反复试验后,我发现上面是我的32位Intel机器上允许使用GCC 4.3的最大静态阵列.这是标准限制,编译器限制还是机器限制?显然我可以拥有我想要的那么多.这将是段错误,但只有当我要求(并尝试使用)时,malloc才会给我更多.

有没有办法确定静态数组是否实际分配并且可以安全使用?

编辑:我感兴趣的是为什么malloc用于管理堆而不是让虚拟内存系统处理它.显然,我可以将一个数组的大小调整到我认为我需要的大小的很多倍,并且虚拟内存系统只会保留ram所需的内容.如果我从未写过例如这些巨大数组的结束(或开头)那么程序就不会使用物理内存.此外,如果我可以写入每个位置,那么malloc除了在堆中递增指针或在同一进程中搜索先前的分配外,还做了什么呢?

编者注: 如果int是32位,则1 << 31 导致未定义的行为,所以我修改了要阅读的问题1u.问题的目的是询问有关分配大型静态缓冲区的问题.

Vla*_*dim 14

那么,有两个原因:

  1. 由于可移植性,因为某些系统不会为您进行虚拟内存管理.

  2. 您将不可避免地需要将此数组划分为更小的块以使其有用,然后跟踪所有块,然后最终当您开始"释放"阵列的某些块时,您不再需要它内存碎片问题.

总而言之,您最终将实现大量内存管理功能(实际上几乎重新实现了malloc),而没有可移植性的好处.

因此原因:

  • 通过内存管理封装和标准化实现代码可移植性.

  • 通过代码重用的方式提高个人生产力.


dfa*_*dfa 10

使用malloc,您可以增长和缩小阵列:它变得动态,因此您可以精确地分配您需要的内容.


ala*_*mar 5

我猜这叫做自定义内存管理.你可以这样做,但你必须自己管理那块内存.你最终会编写自己的malloc()来解决这个问题.


归档时间:

查看次数:

1397 次

最近记录:

10 年,11 月 前