Ich lese "Effective Modern C++". In dem Artikel, der sich auf std::unique_ptr
bezieht, heißt es, dass, wenn der benutzerdefinierte Löscher ein zustandsloses Objekt ist, keine Größengebühren anfallen, aber wenn es sich um einen Funktionszeiger oder um eine std::function
Gebühr handelt. Können Sie erklären warum?C++ std :: unique_ptr: Warum gibt es bei lambdas keine Größengebühren?
Lassen Sie uns sagen, dass wir den folgenden Code haben:
auto deleter_ = [](int *p) { doSth(p); delete p; };
std::unique_ptr<int, decltype(deleter_)> up(new int, deleter_);
Zu meinem Verständnis, das unique_ptr
ein Objekt vom Typ sollte decltype(deleter_)
und weisen deleter_
zu diesem internen Objekt. Aber offensichtlich passiert das nicht. Können Sie den Mechanismus dafür anhand eines möglichst kleinen Codebeispiels erklären?
Die Implementierung kann die leere Basisklasse Optimierung auf ihre internen Daten verwenden, wodurch ein Das staatenlose Deleter-Objekt "verschwindet", indem es eine andere Struktur daraus ableitet. –
@BoPersson OK, ich kann nicht herausfinden, wie diese Technik hier verwendet wird. Könnten Sie eine Antwort darauf schreiben? Vielen Dank. –
Ok, ich habe ein Beispiel hinzugefügt. –