Kann ich warf shared_ptr<T> & zu shared_ptr<T const> & ohne änderung use_count?

Ich habe ein Programm, das mit boost::shared_ptrs und insbesondere, verlässt sich auf die Genauigkeit der use_count um Optimierungen durchzuführen.

Beispielsweise vorstellen, eine addition mit zwei argument-Zeiger genannt lhs und rhs. Sagen, Sie haben beide den Typ shared_ptr<Node>. Wenn es Zeit, um die Ergänzung, ich werde prüfen, die use_count, und wenn ich finde, dass eines der Argumente hat einen reference count von genau einer, dann werde ich es wiederverwenden, um den Vorgang auszuführen, statt. Wenn weder argument kann wiederverwendet werden, muss ich reservieren einer neuen Daten-Puffer und führen Sie die operation out-of-Platz. Ich bin den Umgang mit den enormen Daten-Strukturen, so dass die in-place-Optimierung ist sehr vorteilhaft.

Da kann ich nie kopieren Sie die shared_ptrs ohne Grund, D. H., jede Funktion nimmt die shared_ptrs durch Referenz oder const-Referenz zu vermeiden, verzerren use_count.

Meine Frage ist: ich habe manchmal das shared_ptr<T> & ich will zu werfen, um shared_ptr<T const> &, aber wie kann ich es tun, ohne zu verzerren die Anzahl der? static_pointer_cast gibt ein neues Objekt eher als eine Referenz. Ich würde geneigt sein, zu denken, dass es funktionieren würde, nur werfen die ganze shared_ptr wie in:

void f(shared_ptr<T> & x)
{
  shared_ptr<T const> & x_ = *reinterpret_cast<shared_ptr<T const> *>(&x);
}

Bezweifle ich stark, dies entspricht dem standard, aber, wie ich schon sagte, es wird wahrscheinlich funktionieren. Gibt es eine Möglichkeit, das zu tun, garantiert sicher und richtig?

Aktualisierung zu Konzentrieren, die Frage

Kritisieren das design nicht helfen, die Antwort in diesem post. Es gibt zwei interessante Fragen zu berücksichtigen:

  1. Gibt es keine Garantie (der Verfasser der boost::shared_ptr oder von der Norm, im Fall der std::tr1::shared_ptr), die shared_ptr<T> und shared_ptr<T const> haben die gleichen layouts und Verhalten?

  2. Wenn (1) wahr ist, dann ist die oben eine Legale Verwendung von reinterpret_cast? Ich denke, Sie würden sein hart gedrückt, um finden ein compiler erzeugt fehlerhaften code für das obige Beispiel, aber das bedeutet nicht, dass es legal ist. Was auch immer Ihre Antwort, können Sie Unterstützung finden, für die es in der C++ standard?

  • Mit dem Verweis für die Zählung in einer Weise sieht aus wie eine sehr eigenartige design der route. Warum nicht setzen einige Kontrolle darüber, ob ein Vorgang geschieht, oder durch kopieren auf den Benutzer? Oder separate gemeinsame und eindeutige Hinweise?
InformationsquelleAutor AndyJost | 2012-03-31
Schreibe einen Kommentar