【发布时间】:2011-12-27 18:03:16
【问题描述】:
这是来自 Beej 的 C 指南 “使用 calloc() 的缺点是清除内存需要时间,而且在大多数情况下,您不需要清除它,因为无论如何您都会重写它。但是如果您发现自己是 malloc ()ing 一个块,然后立即将内存设置为零,您可以使用 calloc() 在一次调用中执行此操作。”
那么当我想将内存清零时,可能的情况是什么。
【问题讨论】:
标签: c pointers dynamic-memory-allocation
这是来自 Beej 的 C 指南 “使用 calloc() 的缺点是清除内存需要时间,而且在大多数情况下,您不需要清除它,因为无论如何您都会重写它。但是如果您发现自己是 malloc ()ing 一个块,然后立即将内存设置为零,您可以使用 calloc() 在一次调用中执行此操作。”
那么当我想将内存清零时,可能的情况是什么。
【问题讨论】:
标签: c pointers dynamic-memory-allocation
当您将缓冲区传递给函数时,在其文档中声明缓冲区必须是零填充的。为了安全起见,您也可以始终将内存清零;除非缓冲区真的很大,否则它实际上并不需要太多时间。内存分配本身是操作中潜在的昂贵部分。
【讨论】:
一种情况是您分配一个整数数组(例如,作为累加器或计数器变量),并且您希望数组中的每个元素从 0 开始。
【讨论】:
在某些情况下,您正在为某个结构分配内存,而该结构的某些成员可能会在 some expression 或 conditional statement 中进行评估,而无需初始化该结构在这种情况下,这将是有害的,或者会给您带来不确定的行为。所以克服这个更好的你
1> malloc that structure and memset it with 0 before using that structure
或
2> calloc that structure
注意:一些使用 malloc 的高级内存管理程序也会用 0 重置内存
【讨论】:
很多时候您可能希望内存归零!
一些例子:
【讨论】:
如果所有分配的内存都是零填充的,则程序的行为更具可重现性(因此,如果您重新运行程序,行为更有可能相同)。这就是我不使用未初始化的 malloc 区域的原因。
(出于类似的原因,在 Linux 上调试 C 或 C++ 程序时,我通常使用echo 0 > /proc/sys/kernel/randomize_va_space,以便mmap 的行为更可重现)。
如果您的程序不分配大块(即几十兆字节),则在 malloc 中花费的时间远大于将其归零的时间。
【讨论】: