Wenn ich gedanklich überschlage, was man alles tun muss um eine Hasmap zu implementieren, kann ich mir nicht vorstellen, dass das weniger Aufwand ist als ein shared/weak ptr. Tatsächlich müsste man schon wirklich Glück haben, die selbe Geschwindigkeit zu erreichen, ich würde eher davon ausgehen, dass es um einiges langsamer ist.MasterQ32 hat geschrieben:Man könnte ja auch dann eine Art Objekt-Referenz machen, welche ein ID-System mit Hashmap nutzt, dass die De-/Referenzierung via Hashmap+ID übernimmt. Wenn man dann *, -> überschreibt, sollte das ja doch relativ fix gehen (gucken ob ID in hashmap/array/whatever, wenn nicht, nullptr)
Dadurch hätte man eine schöne sharedpointerfreie geschichte
Begründung: Man braucht eine ganze Reihe Buckets um die Zeiger zu speichern. Entweder hat man sehr viele, die dann fast alle leer sind, oder man riskiert das man nach dem Hashen noch den Bucket durchiterieren muss. Was ein weak_ptr letztendlich macht ist direkt auf den passenden Speicherbereich zuzugreifen (anstatt die Position erst über Hashen eines Wertes zu ermitteln) und dort eine Operation auszuführen (anstatt potentiell den ganzen Bucket durchzuloopen). Gut, man muss im extra-Speicher zwei Zähler anstatt einen Zeiger speichern (wobei es ja in den meisten Fällen gar keine 32-bit Zähler sein müssen), aber dafür hat die Hashmap immer eine Menge Buckets, von denen viele leer sein können. Oder, was noch schlimmer ist, die Buckets sind keine Arrays sondern Listen, wodurch Speicherplatz gespart wird, aber der Zugriff noch langsamer wird.
Hashmap sind von der Idee nett, weil sie fast sowas wie konstante Zugriffszeit bieten, aber das bedeutet ja noch lange nicht, dass diese Konstante in der Praxis nicht groß sein kann.