Könnte, würde, müsste... Teste. Und wenn es sich herausstellt, dass die Allokation der Flaschenhals ist, würden sich memory pools als sinnvolle Lösung anbieten (auch für den reference counter).
Gerade bei Partikeln (und ähnlich kleinen Objekten) bieten sich memory pools an und um ehrlich zu sein, habe ich noch nie gesehen, dass Partikel einzeln auf dem Heap alloziert werden (obwohl es durchaus gute Gründe geben könnte, dies zu tun).
Aber ich gebe zu, mein Vorschlag den zweiten Vektor wegzuoptimieren ist nicht gerade einleuchtend. Aber um einen Performance-/Speichervorteil ging es mir dabei weniger, das hast du dann selbst hineininterpretiert. Ich habe gesehen, dass deine Sruktur Ähnlichkeiten mit einem memory pool hat und habe einen Ansatz vorgeschlagen, wie man den zweiten Vektor eliminieren könnte. Ob es in deinem Anwendungsfall sinnvoll wäre, musst du dann selbst entscheiden.
Den Gedankengang kann nicht nicht ganz nachvollziehen. Willst du damit sagen, dass die Zeit, um über 50 acht Byte große Elemente zu iterieren, dieselbe ist, wie über 100 vier Byte große Elemente? Das Einzige, was hier wahrscheinlich gleich wäre, wäre das Cacheverhalten.
Übrigens könnte man, statt nur den reference counter zu allozieren, eine Struktur allozieren, die sowohl den reference counter, als auch den Objektzeiger enthält, womit der smart pointer nur noch die Größe eines Zeigers hätte. Ob das sinnvoll wäre, muss man wieder im Anwendungsfall genauer betrachten.
I beg to differ. (Hey, ich kann auch ein bisschen Englisch.) Ich halte es nicht für premature optimization, sich ein paar Gedanken über die Implementierungsmöglichkeiten zu machen. Eine naive Implementierung könnte sich im Nachhinein als mindestens genauso problematisch erweisen, als eine mikrooptimierte, verworrene Implementierung mit einem effektiven Vorteil von 0.0001%. Dass die Leser hier sich ihre eigenen Gedanken machen und vor dem Implementieren abwägen, soviel möchte ich ihnen zutrauen.
Zwei Objekte, A und B, beide reference counted und beide besitzen auf das jeweils andere Objekt eine Referenz. Um den reference cycle aufzuheben, machen wir As Zeiger auf B zu einem raw pointer. Wenn nun alle Referenzen auf B erlöschen, wird B gelöscht und As raw pointer wird zu einem dangling pointer.
Und As Zeiger auf B aus Bs Destruktor zu manipulieren werde ich nicht akzeptieren.![]()