Wenn ich mich richtig erinnere, malloc tatsächlich ruft eine OS-spezifische Funktion
Nicht ganz. Die meiste Hardware hat eine Seitengröße von 4 KB. Betriebssysteme stellen im Allgemeinen keine Speicherzuweisungsschnittstelle bereit, die etwas anbietet, das kleiner ist als seitengroße (und seitenausgerichtete) Blöcke.
malloc
den größten Teil seiner Zeit damit verbringt, den virtuellen Speicherplatz verwalten, die bereits zugeordnet wurde, und nur fordert gelegentlich mehr Speicher vom Betriebssystem (natürlich hängt dies von der Größe der Elemente, die Sie zuteilen und wie oft Sie free
).
Es gibt ein häufiges Missverständnis, dass wenn Sie free
etwas ist es sofort an das Betriebssystem zurückgegeben wird. Während dies manchmal auftritt (insbesondere bei größeren Speicherblöcken), ist es im Allgemeinen der Fall, dass der Speicher dem Prozess zugewiesen bleibt und dann später von malloc
s erneut verwendet werden kann.
So ist die meiste Arbeit in der Buchhaltung von bereits zugewiesenen virtuellen Raum. Zuweisungsstrategien können viele Ziele haben, wie beispielsweise eine schnelle Operation, eine geringe Speicherverschwendung, eine gute Lokalität, Platz für dynamisches Wachstum (z. B. realloc
) und so weiter.
Wenn Sie mehr über Ihr Muster der Speicherzuweisung und -freigabe wissen, können Sie malloc
und free
für Ihre Nutzungsmuster optimieren oder eine umfangreichere Schnittstelle bereitstellen.
Zum Beispiel können Sie viele gleich große Objekte zuweisen, die die optimalen Zuordnungsparameter ändern können. Oder Sie können immer große Mengen von Objekten auf einmal freigeben. In diesem Fall sollten Sie keine ausgefallenen Dinge tun.
Werfen Sie einen Blick auf memory pools und obstacks.
am wahrscheinlichsten sind sie vor-Zuweisung eines großen Speicherblocks (eine "Speicher Arena"), die Fragmentierung vermeidet und ermöglicht eine bessere Allokationsleistung – BrokenGlass
Yup, können Sie das Betriebssystem für einen großen Teil der angrenzenden Speicher Milo fragen. Es ist ziemlich üblich in der Systemwelt. –
Ja, was sie am wahrscheinlichsten tun, ist einen Wrapper um malloc zu schreiben, den sie benutzen, anstatt malloc direkt anzurufen, was die Geschwindigkeit in einigen Fällen erhöht, aber nicht das Betriebssystemlevel ersetzt –