2012-04-11 12 views
4

Was ist der Hauptunterschied bei der Blockzuweisung im Vergleich zur Zuweisung einzelner Objekte? Lassen Sie sich sagenC++ - Objektblockzuordnung im Vergleich zur einzelnen Zuweisung

int iCount = 5; 

int i = 0; 
while(i < iCount) 
{ 
    f = new foo(); 
i++; 
} 

////////////////// 
foo* f = new foo[iCount]; 

wird diese zweite Methode etwas Speicherplatz für mich speichern ?. Ich habe gehört, dass jedes Objekt von 16 Admin-Bytes umgeben. Die Blockzuweisung verwendet also nur einen Header-Guard. ist es wahr?.

+0

Ich hörte, dass jedes Objekt, das wir von 16 Admin-Bytes umgeben umgeben. Die Blockzuweisung verwendet also nur einen Header-Guard. ist es wahr?. – nsa

+0

Ich habe dieses Gerücht nicht gehört. Auf der anderen Seite wird 'new []' wahrscheinlich 'iCount' irgendwo speichern müssen, damit 'delete []' es finden kann.Vielleicht braucht das mehr Speicher und nicht weniger? –

Antwort

3

Jede Zuteilung, die Sie tun, weist auch Zuweisungsheader (manchmal auch eine Fußzeilenwächterstruktur) zu, die von dem von Ihrem Zuordner verwendeten Algorithmus abhängt. Here, können Sie eine Beschreibung eines solchen Algorithmus finden.

Beim zuzuteilen ein Array, der Zuordner (hauptsächlich malloc()) mit sizeof(element) * count als Argument aufgerufen werden und wird gesamte Array als ein Block zuzuteilen, eine Header-Struktur verwendet wird, so wird es weniger Speicheraufwand einzuführen, als Zuteilen Elemente one-by -one (siehe Hinweis unten).

Wie auch immer (wie die Frage mit gekennzeichnet ist), sollte guter C + + Programmierer vermeiden, Speicher manuell zu handhaben. Verwenden Sie für das Array Standardbibliotheksklassen (vector, map, list usw.). Verwenden Sie RAII, wenn möglich, verwenden Sie keine rohen Zeiger, sondern "intelligente".


Hinweis: alles, was ich hier geschrieben habe, ist ganz auf Algorithmus abhängig verwendet, so dass Absatz über Array Zuweisung nicht auf alle möglichen Speicherzuordnung Algorithmen gelten. Die direkte Antwort auf "Was ist der Hauptunterschied zwischen Blockzuordnung und individueller Objektzuweisung?" Ist also auch algorithmusabhängig.

+0

[link] https://docs.google.com/viewer?a=v&q=cache:pYPYfnZDX1IJ:www.cs.princeton.edu/courses/archive/fall06/cos217/lectures/14Memory-2x2.pdf+&hl= en & gl = lk & pid = bl & SRCID = ADGEESiIr1Gl8BNo_aT5qF2e-ZWHRCtXfJBj699onMJs4Gg9Q9n-urnYOPwT2pflgd5OmA-VHRHWAsDWxnQLb9HsbbpBcmAfXrC_VX9QfRvB9KYNtcOIoljYMEb6DOiiiAEk7Nwlbap4 & sig = AHIEtbQrgAdEyk2TJ09oUvjMrrYnLfPvNQ & pli = 1 – nsa

1

Ein weiterer sehr wichtiger Unterschied ist die Ausnahmesicherheit. In Ihrem Code:

int iCount = 5; 
int i = 0; 
while(i < iCount) 
{ 
    f = new foo(); 
    i++; 
} 

Sie müssen sehr, sehr vorsichtig sein, keine Speicherlecks mit diesem zu erzeugen; Sie müssen sich unbedingt an alle foo erinnern, um diese im Falle einer Ausnahme ordnungsgemäß zu reinigen. Wenn sich dieser Code in einem Konstruktor befindet, reicht es nicht aus, die Zuordnung in Ihrem Destruktor aufzuheben, denn wenn eine Ausnahme ausgelöst wird, wird Ihr Objekt niemals zum Leben erweckt und der Destruktor wird nicht aufgerufen. Diese weitere pflanzt richtige Kopie-Konstruktion und Kopie-Zuordnung zu schreiben, jede Ausnahme Safe, etc.

Moral: Verwenden Standardcontainer, wie vector, list oder deque (es gibt mehr).

////////////////// 
foo* f = new foo[iCount]; 

mindestens Dies wird jeder foo konstruiert zerstören, wenn eine Ausnahme zwischen Zuteilung der ersten und letzten foo geworfen wird.

Natürlich müssen Sie darauf achten, dass f ordnungsgemäß gelöscht wird, vor allem, wenn es andere Wurfpunkte gibt, der Code, der diese Zuweisungen durchführt.

Moral: Verwenden Sie Standardbehälter. Die manuelle Speicherverwaltung mag auf den ersten Blick trivial erscheinen, besonders wenn Sie von C kommen, aber es ist nicht-trivial und kritisch, ausnahmesicheren Code zu schreiben.

Verwandte Themen