Für welchen Zweck sollte ich verwenden std::get_temporary_buffer
? Standard sagt folgendes:
Erhält einen Zeiger auf die Speicherung, der ausreicht, um bis zu n benachbarte T-Objekte zu speichern.
Ich dachte, dass der Puffer auf dem Stapel zugewiesen wird, aber das ist nicht wahr. Nach dem C ++ Standard ist dieser Puffer eigentlich nicht temporär. Welche Vorteile hat diese Funktion gegenüber der globalen Funktion ::operator new
, die auch die Objekte nicht erstellt ? Habe ich recht, dass die folgenden Aussagen gleichwertig sind?
int* x;
x = std::get_temporary_buffer<int>( 10 ).first;
x = static_cast<int*>( ::operator new( 10*sizeof(int) ) );
Existiert diese Funktion nur für Syntaxzucker? Warum gibt es temporary
in seinem Namen?
Ein Anwendungsfall wurde im Dr. Dobb's Journal vom 1. Juli 1996 für die Implementierung von Algorithmen vorgeschlagen:
Wenn kein Puffer zugewiesen werden kann oder wenn er kleiner als angefordert ist, funktioniert der Algorithmus immer noch korrekt. Er verlangsamt sich lediglich.
std::get_temporary_buffer
wird in C ++ 17 veraltet sein.Antworten:
Stroustrup sagt in "The C ++ Programming Language" ( §19.4.4 , SE):
Er beginnt auch die Einführung in die beiden Funktionen mit:
... scheint aber nirgendwo eine Definition von vorübergehend oder längerfristig zu liefern .
Eine Anekdote in "Von der Mathematik zur generischen Programmierung" erwähnt, dass Stepanov eine falsche Platzhalterimplementierung im ursprünglichen STL-Design bereitgestellt hat:
quelle
operator new
mit immer kleineren Argumenten aufgerufen wird, bis die Zuordnung erfolgreich ist. Keine besonderen Optimierungen da.crazy_allocator
get_temporary_buffer
. Wenn wir jedoch weniger als den angeforderten Betrag erhalten (was sehr schade wäre), versuchen wir weiterhin, unsere Arbeit mit dem Speicher zu erledigen, den wir haben. Könnte besser sein, alsbad_alloc
Ausnahmen abzufangen, die durch den Versuch verursacht wurden, mehr Speicher als verfügbar zuzuweisen. Der wahre Nutzen steht und fällt jedoch mit einer guten Implementierung.Der Standardbibliothekstyp von Microsoft sagt Folgendes ( hier ):
quelle
Der Standard sagt, dass er Speicher für bis zu
n
Elemente zuweist. Mit anderen Worten, Ihr Beispiel gibt möglicherweise einen Puffer zurück, der groß genug für nur 5 Objekte ist.Es scheint jedoch ziemlich schwierig, sich einen guten Anwendungsfall dafür vorzustellen. Wenn Sie auf einer Plattform mit sehr wenig Speicher arbeiten, ist dies möglicherweise eine bequeme Möglichkeit, "so viel Speicher wie möglich" zu erhalten.
Aber auf einer so eingeschränkten Plattform würde ich mir vorstellen, dass Sie den Speicherzuweiser so weit wie möglich umgehen und einen Speicherpool oder etwas verwenden, über das Sie die volle Kontrolle haben.
quelle
Die Funktion ist in C ++ 17 veraltet, daher lautet die richtige Antwort jetzt "keinen Zweck, verwenden Sie sie nicht".
quelle
Antwort kann weniger als Anfrage sein .
die tatsächliche Größe der Basis muss größer oder gleich erfordern .
quelle
Vielleicht (nur eine Vermutung) hat es etwas mit Speicherfragmentierung zu tun. Wenn Sie das zeitliche Gedächtnis weiterhin stark zuweisen und freigeben, aber jedes Mal, wenn Sie dies tun, nach der Zuweisung des temporären Speichers ein beabsichtigtes Langzeitgedächtnis zuweisen, bevor Sie es freigeben, kann dies zu einem fragmentierten Heap führen (denke ich).
Der get_temporary_buffer könnte also als ein Speicherblock gedacht sein, der größer ist als Sie benötigen und der einmal zugewiesen wird (möglicherweise sind viele Blöcke bereit, um mehrere Anforderungen anzunehmen), und jedes Mal, wenn Sie Speicher benötigen, erhalten Sie nur einen der Brocken. Der Speicher wird also nicht fragmentiert.
quelle