Ich möchte jetzt, wenn es möglich ist, und schließlich, wie es möglich ist, eine Klasse auf eine besondere Art und Weise zu implementieren, so dass Sie einen Vektor dieser Klasse erstellen können und nach dem Ausfüllen, durchlaufen die Klassenattribute ohne Iteration des Vektors.C++ Klasse Speicherlayout
Dies ist ein Beispiel:
class Vertex3f
{
public:
union
{
float vec[3];
struct
{
float x, y, z;
};
};
public:
Vertex3f();
~Vertex3f();
...
}
Dann eine std::vector
dieser Klasse erstellen, füllen Sie es und Zugang alle Instanzen Klassenattribute:
Vertex3f v1, v2;
v1.x = 10.0f;
v1.y = 0.0f;
v1.z = 5.0f;
v2.x = 8.0f;
v2.y = -5.0f;
v2.z = 3.0f;
// Create and fill the vector
std::vector<Vertex3f> vec;
vec.push_back(v1);
vec.push_back(v2);
// Get all the vertices data in one go
// This is the tricky part I'm not sure it can be done
size_t size = vec.size() * (sizeof(float) * 3);
float* vertices = new float[size];
memcpy(vertices, &vec[0].x, size);
ich jetzt, dass die Bullet Physics Bibliothek tut so etwas aus Leistungsgründen und ich würde gerne dasselbe machen, aber ich verstehe nicht wie.
Es gibt ein kleines Problem mit Ihrem Code: Es gibt keine Garantie, dass 'float vec [3]' und Ihre Struktur die gleiche Größe haben. Wenn der systemeigene Compiler-Padding für ein System 64-Bit ist, ist die Struktur doppelt so groß wie das Array. –
Sie sollten wahrscheinlich herausfinden, was C++ über [POD-Typen] (http://en.cppreference.com/w/cpp/concept/PODType) und [Speicherausrichtung] sagt (http://stackoverflow.com/q/5435841)/3344612) – teivaz
Genau darum ging es mir. 'float vec [3]' hat nicht die gleiche Größe wie meine Klasse, da die Klasse auch Mitgliedsfunktionen und andere Attribute enthält. – zeb