我需要在内存中存储一个“大”文件(比如2mb以下),我想知道是否可以使用
char buffer[2048000];
有没有更好的方法来处理它?使用大型char数组的任何性能问题?
答案 0 :(得分:4)
是的,可能存在问题,如果它是自动存储持续时间的变量,那么大多数C实现都会在堆栈上分配该缓冲区,以及"堆栈内存的数量"可供使用的可能非常小。
最好的办法是将malloc
用于大于几千字节的任何内容。请记住在适当的时候致电free
。
使static
成为另一种可能性,或者让全球可能帮助。
答案 1 :(得分:4)
如果在全局命名空间中声明它,则没有问题。它只是一块内存,所以没有任何性能问题。
在函数中,变量将在堆栈上分配,并且您可以轻松地耗尽堆栈空间。避免这种方法。如果仅在本地范围内需要它,请使用malloc
分配内存或使用mmap
来处理文件。
答案 2 :(得分:3)
您可以通过3种方式分配缓冲区:
1)在堆栈上。在函数范围内定义非静态数组时会发生这种情况。堆栈大小取决于您的编译器和体系结构,但经验法则是不应该尝试并在那里分配大缓冲区。
2)在堆上(使用malloc
)。你可以安全地在那里分配大缓冲区。
3)在程序数据段中。在任何范围内定义静态数组时都会发生这种情况。在那里分配大数组也没关系。
答案 3 :(得分:1)
当您以这种方式静态分配缓冲区时,您要求计算机在内存中释放2048000个连续字节。这与要求2048000字节的空闲内存不同,因为它必须也是连续的。因此,您可以想象分配的空间越大,您发现连续内存量的可能性就越小。
常见的方法是使用malloc来分配内存。这使程序有机会检查返回值,并在返回NULL的情况下对其执行操作(不给出内存)。这并没有减少发生内存问题的可能性,但它也允许程序员在这种情况下拥有更多的控制权。
如果您需要分配大量内存(足够大,这可能是一个问题),一种方法是创建一个较小的char数组的链表。当您到达一个数组的末尾时,您将跟随链接列表到下一个数组并继续阅读。最好配上一对辅助方法,这样来电者就不必担心这些细节。
这确保您不需要2MB的连续内存,但每个200kb需要10个连续的阵列,这意味着它们可能位于内存中的不同位置。
在预先分配程序中使用的内存的应用程序中(如游戏的情况),常见的方法是这样,在链表中有多个较小的分配数组。缓冲区也是最初编写的,因为已知操作系统懒惰地分配内存,而不是实际分配内存直到第一次访问它,正如你所能想象的那样,当程序实际需要内存时会产生问题。 。预分配内存的一大优点是在程序的生命周期中通常不需要新的内存,并且最终可以释放整个链表而无需跟踪单个指针分配。