In diesem 2010 Papier [1] über Raycasting sparse voxel octrees (SVGs) (Entschuldigung; das Papier braucht etwas Zeit zum Laden), Abschnitt 3 weist auf eine interessante Speicherkonfiguration hin, um Speicherplatz auf Voxeldaten zu sparen, die fast immer sehr groß sind.
Sie geben einen relativen 15-Bit-Zeiger mit einem 1-Bit-Flag an, um anzugeben, ob ein entfernter Zeiger benötigt wird (wenn die Volumendaten zu groß sind, wird das Flag gesetzt und der 15-Bit-Zeiger wird als Punkt betrachtet) zu einem sekundären, fernen Zeiger).
Was wird getan, um dies zu erreichen? Hat das etwas mit CUDA / GPU zu tun? Wird es durch einen benutzerdefinierten Zuordner in C ++ - Code durchgeführt?
Wie würde dies in C ++ geschehen, wenn überhaupt?
[1] Effiziente sparse Voxel Octrees: Samuli Laine, Tero Karras; NVIDIA Forschung
Haben Sie bemerkt, dass jeder der Standardcontainer eine Zuordnungsvorlage verwendet? So können Sie seltsame Speichermodelle implementieren, wie Sie es beschreiben. (Oder Daten, die sich über das Netzwerk auf einem anderen Computer befinden oder dynamisch berechnet werden ...) Ja, der beste Weg dazu ist ein benutzerdefinierter Zuordner.
%Vor%Ich habe nicht bemerkt, dass der benutzerdefinierte Zeiger (wie Autopulated) der wichtigste Teil ist. Ein benutzerdefinierter Zuordner ermöglicht Ihnen einfach, die Standardcontainer / -algorithmen / usw. mit diesen Zeigern zu verwenden.
In C / C ++ können Sie Zahlen als Zeiger auf beliebige Weise interpretieren - aber es bedeutet, dass Sie nicht einfach deneferenzieren / addieren / subtrahieren und andere normale Zeiger-Dinge tun könnten. Stattdessen müssten Sie Funktionen verwenden, die in einen 'echten' Zeiger konvertieren, um diese Art von Operationen auszuführen.
In C ++ können Sie alles sehr gut in eine Klasse einfügen, die eine zeigerartige Schnittstelle darstellt, indem Sie operator*
, opeartor->
und die arithmetischen Operatoren implementieren.
Wenn man sich einmal die Abbildung 2 anschaut, dann könnte eine Implementierung der vorgeschlagenen Zeiger aussehen (beachte, dass du sicherstellen willst, dass die Klasse nicht aufgefüllt wird, wenn du dies tatsächlich tust 32 oder 64 Bits sowieso, und dass sie auf 2-Byte-Grenzen zugewiesen werden - es gibt normalerweise Compiler-spezifische Direktiven, um dies zu kontrollieren.)
%Vor%