2016-06-17 28 views
-2

Ich habe irgendwo gelesen, dass die Zeit für die Zuordnung k Worte des Speichers O (k) ist, möchte ich wissen, dass diese Zeit für Laufzeit und Kompilierzeit gleich ist Speicherzuweisung, bedeutet wollen wissen nicht int A[100]; und int *A = (int*) malloc(sizeof(int) * 100); würde gleichzeitig oder zu verschiedenenZeitunterschied zwischen Kompilierzeit und Laufzeit Speicherzuweisung

+1

Algorithmisch ist die statische Zuweisung O (1) und die dynamische Zuweisung hängt vom spezifischen "malloc" -Algorithmus ab. Technisch gesehen könnte die statische Zuordnung die binäre Lade-/Prozess-Laichzeit beeinflussen. Aber überhaupt nicht linear. –

+3

Es gibt keine "Kompilierungszeit-Zuweisung". Die Zuordnung ist in der Regel eine dynamische Interaktion zwischen Ihrem Programm und dem Betriebssystem. Speicher, der automatisch vom Compiler (statisch und automatisch) platziert werden kann, wird in der ausführbaren Datei aufgezeichnet, und die Zuordnung wird vom Betriebssystemladeprogramm ausgeführt, bevor der Code ausgeführt wird. Es gibt Details darüber, ob der Speicher initialisiert oder nicht initialisiert ist und ob er konstant oder veränderlich ist. –

+1

Also im Plain English, wird die statische Zuweisung ('int a [100]') vor dem Aufruf von 'main()' ausgeführt, und es wird nicht gestartet, wenn nicht genügend Speicher vorhanden ist (zB 'int a [99999999]') . Wenn Sie die Zeit von Anfang an zählen, dann ist es "schneller", weil es startet und keine Zeit für die dynamische Zuweisung benötigt oder gar nicht startet, während die dynamische Zuweisung während der Laufzeit einige CPU-Zyklen benötigt. – JustMe

Antwort

0

dynamische Zuweisung Speicher macht nehmen O (k) Zeit in Anspruch nehmen. Es hängt davon ab, ob der Zuordner (malloc) oder eine der aufgerufenen Funktionen den Speicher initialisiert, bevor er zurückkehrt. Zum Beispiel, wenn die Windows-mallocLocalAlloc Funktion aufruft Speicher vom Betriebssystem zu bekommen, könnte es die LMEM_ZEROINIT Flag übergeben, um alle Bytes Zuweiser automatisch Null-init-Speicher aus Sicherheitsgründen auf 0

Einige Betriebssystemspeicher zu initialisieren. Einige Implementierungen von malloc initialisieren Speicher mit einem bekannten Muster wie 0xDEADBEEF, insbesondere im Debug-Modus. Auf diese Weise können Sie beim Lesen eines Core-Dumps feststellen, ob Ihr Programm auf Speicher zugreift, der vom Programm zugewiesen, aber nicht initialisiert wurde.

So ist die Antwort auf die ausdrückliche Frage, die Sie nicht der Fall war darum bitten, dass, ja, es möglich ist, vielleicht sogar wahrscheinlich, dass die dynamische Speicherzuweisung von k Bytes O (k) Zeit in Anspruch nehmen.

+0

Aus Sicherheitsgründen muss der Speicher vom Betriebssystem initialisiert werden, bevor er an einen Prozess übergeben wird. Dies gilt auch für das Prozessabbild, einschließlich der BSS-Segmente (d. H. Statische Variablen). Wenn ein Aufruf von malloc zu einer Anforderung an das Betriebssystem führt, wird eine Initialisierung durchgeführt. Aber in vielen Anwendungen sind viele Aufrufe von malloc mit Speicher belegt, der zuvor zugewiesen und freigegeben wurde. Damit ist eine Initialisierung nicht notwendig und wird oft, abgesehen vom Debugging, nicht durchgeführt. – rici

+0

@rici: Es sieht so aus, als ob Windows Speicher in einem separaten Thread löscht, wenn ein Prozess Speicher freigibt. Siehe http://stackoverflow.com/questions/18385556/does-windows-clear-memory-pages. Wenn dies der Fall ist, wird der Aufruf des OS, Speicher zuzuweisen, nicht die Kosten der Initialisierung verursachen. –

+0

Das ist interessant und clever, aber es verzögert nur die Kosten. Dies in einem separaten Thread zu tun, macht die Buchhaltung nur komplizierter; es passiert immer noch und es ist immer noch auf die Zuweisung zu berechnen. Aber ich glaube, es verbessert die UX. – rici