gpt4 book ai didi

选择缓冲区的大小

转载 作者:太空狗 更新时间:2023-10-29 17:02:36 24 4
gpt4 key购买 nike

我很困惑,当使用 malloc 分配内存时,您必须提供一个大小,但是,有时您不知道此时需要的大小,所以您要么分配一个大量内存(这听起来不太明智,因为您可能不会全部使用它)或者当初始缓冲区大小变得太小时使用 realloc。这两个选项有效吗?第二个听起来不错,但是,文档说 realloc ...may move the memory block to a new location 这听起来像一个非常糟糕的主意/很难处理情况(例如,如果您在调用 realloc 时有多个指针指向同一地址,它们都变得无效)我是 C 的初学者,有人可以解释我如何处理您遇到的情况有一个缓冲区,它可能会或可能不会增长到占用大量内存。

最佳答案

it sometimes happen that you don't know the size you need at that point so you either alloc a huge amount of memory (which doesn't sound too wise since you're probably not going to use it all) or you use realloc when the initial buffer size becomes too small. Are this two options valid?

原则上是的。实际上,对于现代操作系统 内核和默认系统配置,使用malloc 分配多少并不重要。你看,malloc 分配地址空间,而不是内存。您可以根据需要分配尽可能多的地址空间,它实际上不会消耗内存;当然,操作系统会对该值进行多次健全性检查,例如,在只有 2GiB 可用内存(RAM + 交换)的系统上,您不能分配 3GiB。通常的配置是单个 block 中可分配的最大地址空间 block 是可用系统内存的 50%。

只有当你真正向它写东西时,操作系统才会为它预留内存。所以不要使用 calloc,因为它初始化内存,即向其中写入一些东西。

因此,如果您不知道确切需要多少,只需 malloc 一大块地址空间,您知道,根据处理的数据类型的特征,它可以轻松容纳您的任何内容。重新期待。将其放入内存后,您可以使用 realloc 来缩小分配。对于所有重要的实现,realloc 在收缩分配时永远不会移动数据。

需要注意的一件事是内存过度使用:假设您在具有 4GiB RAM 的系统上运行 5 个进程,每个进程分配 1GiB,但没有立即写入。操作系统会给他们这个地址空间,即它过度使用内存(就像航空公司过度使用航类座位一样)。一段时间后,进程开始写入它。有时系统会耗尽内存,操作系统必须对此采取一些措施:它将开始终止进程​​,直到再次有空间“喘息”。

不过,您可以关闭内存过度使用;强烈推荐用于高可靠性系统。

关于选择缓冲区的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com