Ist es möglich, std::function
mit einer anderen Erklärung zu ersetzen, die Ausgabe von std::bind
direkt dabei von Wert erhalten würde, würde die dynamische Speicherzuweisung vermieden werden?
Ja ist es; aber der Typ, der von std::bind
zurückgegeben wird, ist nicht angegeben. Daher müssen Sie eine Vorlage verwenden, um den Typ zu erfassen.
template <typename F>
void runThisFunction(F func);
Auf der Speicherzuweisung ...
In diesem Aufruf wird der Ausgang von std::bind
in eine std::function
umgewandelt, und die dynamische Speicherzuordnung auftritt als Teil dieses Prozesses.
dynamische Speicher verwendet werden (aber nicht always), hängt es von der Größe des Funktor in die std::function
und der Qualität der Umsetzung gebunden zu sein.
Ferner hat die C++ - Spezifikation diese §20.12.12.2.1/11;
[Anmerkung: Implementationen sind aufgefordert, die Verwendung von dynamisch zugewiesenen Speicher für kleine aufrufbare Objekte, beispielsweise zu vermeiden, wo f
ein Objekt nur einen Zeiger oder eine Referenz auf ein Objekt hält und einen Mitgliedsfunktionszeiger. - Endnote]
Ich wäre nicht zu besorgt über die Speicherzuweisung, selbst wenn es eine gibt. Wenn der Code nicht leistungskritisch ist und Sie ihn als solchen gemessen haben, sollte die erforderliche Indirektion kein Problem darstellen.
Denken Sie daran, dass in Ihrem Fall die foo
gebunden in der bind
ein Zeiger ist und es wahrscheinlich ist, dass es keine dynamische Speicherzuweisung sowieso geben würde.
Ich fing an, diese suchen, weil ich Cache-Misses auf die Umstellung auf
durch Instrumentierung erfasst unerwartete Langsamkeit aufgrund gemessen
So haben Sie einige gemessen Sorgen über die Leistung ... es gibt Alternativen zu verwenden std::bind
gepaart mit std::function
. std::bind
ist ein nützliches Allzweck-Bindemittel, aber das bedeutet nicht, dass es auch leistungsfähig genug ist - machen Sie es selbst. Ein kundenspezifischer Funktor könnte leistungsfähiger sein. Eine lambda-basierte Implementierung wäre auch gut anzusehen. Vergessen Sie auch nicht, dass die Funktion foo
auch mit std::function
verwendet werden kann und Sie dann komplett auf den Funktor/Binder verzichten (Achtung, die Signaturen müssen übereinstimmen).
Eine Randnotiz auf, wie „klein“ das Objekt muss vor den „kleines Objekt“ Optimierungen im Zitat oben Kick erwähnt wird zwischen den Bibliothek-Implementierungen ruhig ein bisschen zu variieren scheint.
hier auf coliru (libstdC++), die Größe des Arguments für std::function
16 Byte sein muss oder weniger, auf MSVC beträgt die Grenze 32 Byte (beide diese aussehen 32-Bit-Plattformen zu sein). Mit einer clang ++ (libC++) 64-Bit-Kompilierung beträgt dieses Limit 24 Byte ... Es hängt wirklich von der Implementierung ab, wie viel Speicherplatz dafür zur Verfügung steht, bevor new
Allokationen vorgenommen werden müssen.
Ich bin nicht sicher, wie kritisch die Leistung ist, aber die Berechnung dieser Grenze für Ihre Ziele könnte auch durchgeführt werden und dann Optimierungen angewendet werden, so dass die Argumente für die std::function
unter diesen Grenzen gehalten werden; z.B. Verwenden eines Zeigers oder einer Referenz (auch std::ref
) zu einem struct
für Argumente (aber es muss darauf geachtet werden, dass diese nicht hängen gelassen werden).
hat 'Vorlage Leere runThisFunction (T func)' zählen? –
@PiotrSkotnicki, Das fühlt sich an wie es funktionieren könnte. Es leidet unter dem üblichen Problem mit Templates (Erzeugen einer Kopie des Codes für jeden Typ), aber ich nehme an, es kann nicht geholfen werden. – merlin2011
Nicht sicher, warum diese Frage abgelehnt wurde. Es kam mir einfach nicht in den Sinn, eine Vorlage zu verwenden, um dieses Problem zu lösen, obwohl es im Nachhinein offensichtlich erscheint. – merlin2011