简短回答:
事实并非如此,在你的情况下它恰好为零。
(此外,您的测试用例并不显示数据为零。它仅显示一个元素是否为零。)
长答案:
你打电话时malloc()
,将会发生以下两种情况之一:
- 它回收先前从同一进程分配和释放的内存。
- 它从操作系统请求新页面。
在第一种情况下,内存将包含先前分配剩余的数据。所以它不会是零。这是执行小额分配时的常见情况。
在第二种情况下,内存将来自操作系统。当程序内存不足时,或者当您请求非常大的分配时,就会发生这种情况。 (就像你的例子中的情况一样)
这里有一个问题:来自操作系统的内存将被归零security原因。*
当操作系统为您提供内存时,它可能已从不同的进程中释放。因此该内存可能包含密码等敏感信息。因此,为了防止您读取此类数据,操作系统在将其提供给您之前会将其清零。
*I note that the C standard says nothing about this. This is strictly an OS behavior. So this zeroing may or may not be present on systems where security is not a concern.
为了提供更多的性能背景:
作为@R。在评论中提到,这个归零就是为什么你应该总是use calloc()代替malloc() + memset() https://stackoverflow.com/questions/2688466/why-mallocmemset-slower-than-calloc?lq=1. calloc()
可以利用这一事实来避免单独的memset()
.
另一方面,这种归零有时会成为性能瓶颈。在一些数值应用中(例如异位FFT http://en.wikipedia.org/wiki/Fast_Fourier_transform),你需要分配一大块临时内存。用它来执行任何算法,然后释放它。
在这些情况下,调零是不必要的并且相当于纯粹的开销。
The most extreme example I've seen is a 20-second zeroing overhead for a 70-second operation with a 48 GB scratch buffer. (Roughly 30% overhead.)
(Granted: the machine did have a lack of memory bandwidth.)
显而易见的解决方案是简单地手动重用内存。但这往往需要突破既定的接口。 (特别是如果它是图书馆例程的一部分)