Ist es OK, ein Double-Array auf eine Struktur aus Doppel zu werfen?Casting Doppel-Array zu einer Struktur von Doppel
struct A
{
double x;
double y;
double z;
};
int main (int argc , char ** argv)
{
double arr[3] = {1.0,2.0,3.0};
A* a = static_cast<A*>(static_cast<void*>(arr));
std::cout << a->x << " " << a->y << " " << a->z << "\n";
}
Diese Drucke 1 2 3
. Aber ist es garantiert immer mit jedem Compiler zu arbeiten?
EDIT: Nach
9.2.21: Ein Zeiger zu einem Objekt struct Standard-Layouts, in geeigneter Weise umgewandelt? Mit einem reinterpret_cast zeigt er auf seinen ursprünglichen Member (...) und umgekehrt.
wenn ich meinen Code mit
struct A
{
double & x() { return data[0]; }
double & y() { return data[1]; }
double & z() { return data[2]; }
private:
double data[3];
};
int main (int, char **)
{
double arr[3] = {1.0,2.0,3.0};
A* a = reinterpret_cast<A*>(arr);
std::cout << a->x() << " " << a->y() << " " << a->z() << "\n";
}
ersetzen dann ist es garantiert zu arbeiten. Richtig? Ich verstehe, dass viele Leute das nicht ästhetisch ansprechend finden würden, aber es gibt Vorteile beim Arbeiten mit einer Struktur und nicht beim Kopieren der Eingangsarraydaten. Ich kann Memberfunktionen in dieser Struktur definieren, um Skalar- und Vektorprodukte, Entfernungen usw. zu berechnen, was meinen Code viel leichter verständlich macht, als wenn ich mit Arrays arbeiten würde.
Wie sei es
int main (int, char **)
{
double arr[6] = {1.0,2.0,3.0,4.0,5.0,6.0};
A* a = reinterpret_cast<A*>(arr);
std::cout << a[0].x() << " " << a[0].y() << " " << a[0].z() << "\n";
std::cout << a[1].x() << " " << a[1].y() << " " << a[1].z() << "\n";
}
Ist dies garantiert auch arbeiten oder die Compiler etwas nach den Datenelementen, so dass sizeof(A) > 3*sizeof(double)
setzen könnten? Und gibt es irgendeinen portablen Weg, den Compiler daran zu hindern?
Jeder kann einen Compiler schreiben, das ist also eine schwierige Frage. Warum geben Sie nicht die Compiler an, die Sie verwenden werden? Meine Vermutung ist, dass alle großen Compiler dasselbe handhaben und es funktioniert. –
Höchstwahrscheinlich nicht (wenn Sie nicht nur double verwenden möchten), aufgrund von [Datenstrukturausrichtung] (https://en.wikipedia.org/wiki/Data_structure_alignment) –
Sie brechen die strenge Aliasing-Regel. – Jarod42