Kurze Antwort:
Es ist nicht so, es ist einfach Null in Ihrem Fall.
(Auch Ihr Testfall zeigt nicht, dass die Daten Null sind. Er zeigt nur, wenn ein Element Null ist.)
Lange Antwort:
Wenn Sie anrufen malloc()
, geschieht eines von zwei Dingen:
- Es recycelt Speicher, der zuvor zugewiesen und von demselben Prozess befreit wurde.
- Es fordert neue Seiten vom Betriebssystem an.
Im ersten Fall enthält der Speicher Datenreste aus früheren Zuordnungen. Es wird also nicht Null sein. Dies ist der übliche Fall bei kleinen Zuordnungen.
Im zweiten Fall stammt der Speicher vom Betriebssystem. Dies geschieht, wenn dem Programm der Speicher ausgeht - oder wenn Sie eine sehr große Zuordnung anfordern. (wie in Ihrem Beispiel)
Hier ist der Haken: Der vom Betriebssystem kommende Speicher wird aus Sicherheitsgründen auf Null gesetzt . *
Wenn das Betriebssystem Speicher bereitstellt, wurde es möglicherweise von einem anderen Prozess befreit. Dieser Speicher kann also vertrauliche Informationen wie ein Kennwort enthalten. Um zu verhindern, dass Sie solche Daten lesen, setzt das Betriebssystem sie auf Null, bevor es sie Ihnen gibt.
* Ich stelle fest, dass der C-Standard nichts darüber aussagt. Dies ist ausschließlich ein Betriebssystemverhalten. Diese Nullung kann also auf Systemen vorhanden sein, auf denen die Sicherheit keine Rolle spielt.
Um mehr Performance-Hintergrund zu geben:
Als @R. den Kommentaren erwähnt in dieser Nullung Deshalb sollten Sie immer verwenden calloc()
anstelle von malloc()
+memset()
. calloc()
kann diese Tatsache ausnutzen, um eine separate zu vermeiden memset()
.
Andererseits ist diese Nullung manchmal ein Leistungsengpass. In einigen numerischen Anwendungen (z. B. der fehlenden FFT ) müssen Sie einen großen Teil des Arbeitsspeichers zuweisen. Verwenden Sie es, um einen beliebigen Algorithmus auszuführen, und geben Sie ihn dann frei.
In diesen Fällen ist das Nullstellen nicht erforderlich und entspricht einem reinen Overhead.
Das extremste Beispiel, das ich gesehen habe, ist ein Null-Overhead von 20 Sekunden für einen 70-Sekunden-Vorgang mit einem 48-GB-Arbeitspuffer. (Ungefähr 30% Overhead.)
(Zugegeben: Der Computer hatte einen Mangel an Speicherbandbreite.)
Die naheliegende Lösung besteht darin, den Speicher einfach manuell wiederzuverwenden. Dies erfordert jedoch häufig das Durchbrechen etablierter Schnittstellen. (besonders wenn es Teil einer Bibliotheksroutine ist)