Qt mit boost::shared_ptr in einen signal/slot

Ist es möglich, und wenn ja, wie kann ich ein signal/slot in Qt das ist eine const-Referenz auf einen shared_ptr? Ich möchte ein signal, das wie folgt aussieht:

void signal( shared_ptr<SomeClass> const & )

Ich wissen, wie dies zu tun, ohne eine Konstante Referenz, das ist einfach die Art shared_ptr<SomeClass> aber für Effizienz* Gründe, die ich möchte vermeiden das kopieren. Die gleiche syntax für den Typ der Referenz nicht funktioniert:

Q_DECLARE_METATYPE(shared_ptr<SomeClass> const &)
qRegisterMetaType<shared_ptr<SomeClass> const&>();

Viele der standard-APIs haben QString const & also gehe ich davon aus es ist grundsätzlich möglich und ich kann einfach nicht herausfinden, die syntax.


**Das größte problem für die Leistung ist nicht das kopieren Zeit, aber die Menge des mutex sperren/entsperren, da das Objekt kopiert und an jeden Empfänger -- es gibt viele von Ihnen. Als mehrere threads verwenden Sie das Objekt, das führt zu einer spürbaren Verlangsamung/Engpass. Wenn der shared_ptr in der Tat verwenden Sie einfach einen atomic op dieser Kosten ist auch trivial, die Allgemeine Frage zu const-Referenz-Signale, bleibt jedoch.*

  • Nicht die übergabe eines shared_ptr als ein const ref negieren der Punkt, der mit einem shared_ptr in den ersten Platz? Geben Sie einfach ein const ref / Zeiger auf das Objekt in Frage.
  • die const-Referenz ist eine Optimierung zu vermeiden, kopieren die shared_ptr beim aufrufen von Funktionen. Es ist ein Recht häufiges Muster. Wenn Sie immer durch Wert übergeben (Signale oder normalen Funktionen) shared_ptr ist sehr kostspielig im Vergleich zu normalen Zeigern. Normale Zeiger können nicht hier verwendet werden, da die Lebensdauer des Objekts aus den "senden" - Seite ist nicht garantiert.
  • mort-ora-y: Funktioniert der boost shared_ptr einen mutex verwenden??? Warum das??? Nicht Atomare Inkrement - /Dekrement-alles, was Sie brauchen?
  • wenn die Lebensdauer nicht garantiert sind, dann warum Sie versuchen, Referenzen statt kopieren der pointer-Objekt? Würden Sie nicht einfach nur eine dangling reference, wenn das Objekt zerstört wurde, ist am anderen Ende?
  • Ich verwendete den Begriff "mutex" zu Locker. Hoffentlich sind Sie nur mit einer atomaren. Hmm, wenn das wirklich stimmt, dann könnte ich das okay sein, da im schlimmsten Fall ihn einfach, weil ein cache-flush.
  • genau der Grund, warum ich mit einem shared_ptr.
  • mort-ora-y würde ich nur sorgen zu machen, die Optimierung, wenn Sie sich tatsächlich gemessenen performance-Problem. Meines Wissens nach, vorbei an einem shared_ptr, um wie ein const ref Niederlagen der Zweck der shared_ptr (D. H. mit einem gemeinsamen Referenz zwischen mehreren Objekten), Wenn Sie können tatsächlich bestimmen, ein performance-Problem, einfach vorbei um einen Zeiger und verwalten Sie Ihre Leben selbst.
  • mort-ora-y wollte Nur follow-up zu Sergej ' s zeigen, die ich glaube nicht, dass Sie bekommen. Offensichtliche Sache hier: Wenn Sie eine ref auf ein Objekt und das original-Objekt außerhalb des Gültigkeitsbereichs, der ref wird ungültig. Nonobvious Sache: wenn Sie nicht erwarten, dass der ref immer ungültig, dann dass bedeutet, dass die ursprünglichen shared_ptr wird nie aus der Umfang, so gibt es keine Notwendigkeit für Sie zu sein, ein shared_ptr in den ersten Platz?
  • Ich Stimme mit den messenger hier. Wenn Sie übergeben Sie einen Verweis auf ein shared_ptr, deren Leben nicht gesichert ist, würde der shared_ptr seinen job tun, richtig? Ich bezweifle es, da Sie nicht erhöhen den Referenzzähler. Sie erhalten nur einen ungültigen Verweis auf den Speicher, wo die shared_ptr verwendet, um zu existieren.
  • mort-ora-y fand ich diese Antwort zu übergeben um einen shared_ptr als Verweis stackoverflow.com/questions/327573/...
  • Gut, ich Stimme zu, dass der "senden" - Seite sollten eine Kopie des shared_ptr, war ich nur hoffen, dass die Empfänger-Seite herstellen konnte, die von const-Referenz (zu vermeiden die Kopie).
  • Ich habe performance-tests alles. Kopieren eines shared_ptr ist extrem langsam im Vergleich zu nicht-Sie zu kopieren. Relativ zu den Kosten von der Signalanlagen ist es nicht schrecklich ist. Shared_ptr ist, wobei etwa 15ns zu kopieren auf meinem test-Maschine.
  • mort-ora-y Vielleicht ist dies eine jener Situationen, wenn Sie aufgeben shared_ptr und nur zu verwalten, die Lebensdauer einer normalen Zeiger selbst?
  • oh, jetzt verstehe ich es. Sie wollte nur eine Kopie, die per Referenz übergeben, um jedem angeschlossenen slot. Jetzt ist es eine gute Idee, aber leider ist Qt nicht Dinge, die in einer anderen Weise. Ich denke, man könnte es umgehen, indem Sie zuerst übergeben Sie eine Kopie Ihrer Zeiger zu einem proxy-Objekt, Leben in der empfangenden thread, der wiederum würde-signal alle Empfänger mit direkten verbindungen, aber ich fürchte, dass Doppel-signaling overhead besiegen würde gerade der Punkt der Vermeidung unnötiger kopieren.

Schreibe einen Kommentar