2009-02-27 13 views
3

Cocoa bietet für page-aligned Speicherbereiche, die es Memory Zones aufruft, und bietet einige Speicherverwaltungsfunktionen, die eine Zone als ein Argument verwenden.Haben Sie jemals NSZoneMalloc() anstelle von malloc() verwendet?

Angenommen, Sie müssen einen Speicherblock zuweisen (nicht für ein Objekt, sondern für beliebige Daten). Wenn Sie malloc(size) aufrufen, wird der Puffer immer in der Standardzone zugewiesen. Möglicherweise hat jedoch jemand allocWithZone: verwendet, um Ihr Objekt in einer anderen Zone als dem Standard zuzuordnen. In diesem Fall scheint es besser zu sein, NSZoneMalloc([self zone], size) zu verwenden, der Ihren Puffer und Ihr eigenes Objekt im selben Speicherbereich hält.

Folgen Sie dieser Praxis? Haben Sie jemals Speicherzonen genutzt?

Update: Ich denke, es gibt eine Tendenz auf Stack Overflow, um Fragen zu Low-Level-Themen mit einem Vortrag über vorzeitige Optimierung zu beantworten. Ich verstehe, dass Zonen auf der NeXT-Hardware 1993 vermutlich mehr Bedeutung hatten als heute, und eine Google-Suche macht deutlich, dass sich praktisch niemand mit ihnen beschäftigt. Ich frage trotzdem, ob jemand ein Projekt beschreiben könnte, in dem sie Speicherzonen nutzen.

+0

Ich habe entweder nie wirklich den Nutzen der Speicherzonen gesehen, also bin ich froh, dass Sie diese Frage gestellt. – Alex

Antwort

2

Ich habe geschrieben Software für Nextstep, GNUstep auf Linux und Cocoa unter Mac OS X, und hat nie Zonen verwenden, um benutzerdefinierte Speicher benötigt. Die Bedingung, die darauf hindeutet, dass es sich um eine gute Verbesserung der Software handelt, ist entweder nie aufgetreten oder wurde nie als signifikant erkannt.

0

Wenn Sie sich dabei befinden, arbeiten Sie wahrscheinlich auf einem niedrigeren Niveau, als Sie wirklich sein sollten. Das Subsystem ignoriert sie ziemlich; Alle Aufrufe an +alloc oder solche erhalten Sie Objekte in der Standardzone. malloc und NSAllocateCollectable sind alles, was Sie wissen müssen.

+0

Sie sagen im Grunde genommen, ich hätte meine Frage nicht stellen sollen? – benzado

+1

+ Alloz gibt nur ein Objekt in der Standardzone zurück, weil es die Standardzone an + allocWithZone übergibt: Dies ist der _real_ allocator. –

1

Sie haben absolut Recht in Ihrer gesamten Frage, aber in der Praxis verwendet niemand wirklich Zonen. Wenn die Seite, auf die Sie verlinken, es einfügt:

In den meisten Fällen ist die Verwendung der Standardzone schneller und effizienter als das Erstellen einer separaten Zone.

Der Nutzen Sie Ihre eigene Zone zu machen ist: in alle zugehörigen Objekte

Wenn ein Seitenfehler tritt auf, wenn eines der Objekte zuzugreifen versuchen, bringt die Seite geladen wird, die erheblich verringern könnte die Anzahl der zukünftigen Seitenfehler.

Wenn ein Seitenfehler auftritt, das heißt, dass das System vor kurzem Paging Dinge war und daher ohnehin langsam ist, und dass entweder Ihre Anwendung ist nicht verantwortlich oder die Lösung im Teil Ihrer Anwendung, die zu viel zugeteilt Speicher sofort an erster Stelle. Die Frage lautet also: "Können Sie beweisen, dass Sie wirklich Ihre eigene Zone erstellen müssen, um ein Performance-Problem zu beheben oder Ihre App so schnell wie möglich zu machen?", Und die Antwort ist "Nein".

+0

Ich weiß, du meintest es gut, aber dein letzter Absatz ist ein bisschen unhöflich.Das ist überhaupt nicht meine Frage; Sie nehmen an, dass ich nur daran interessiert bin, Magie zu finden, die Elfenstaub optimiert und das Dokument, mit dem ich verlinkt habe, nicht gelesen oder verstanden habe. – benzado

+0

Nein, ich gehe davon aus. Mein Punkt ist, dass der einzige Zweck von Zonen darin besteht, Dinge schneller zu machen, und sie machen die Dinge niemals schnell genug, um sie für irgendeinen Zweck zu rechtfertigen. –

+0

Ich glaube nicht, dass Peter versucht hat, das zu sagen, das war DEINE Frage, nur dass es die Frage ist, ob man überlegen sollte, ob man benutzerdefinierte Zonen verwenden soll. Es ist eine rhetorische Frage, die man sich während des Designprozesses stellen sollte. –