Casting von Double-Arrays in eine Struktur von Doubles

Casting von Double-Arrays in eine Struktur von Doubles


Ist es in Ordnung, ein Double-Array in eine Struktur aus Doubles umzuwandeln?


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";
}

Dies gibt 1 2 3 aus . Aber funktioniert es garantiert immer mit jedem Compiler?


EDIT:Laut



wenn ich meinen Code durch

ersetze
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";
}

dann funktioniert es garantiert. Richtig? Ich verstehe, dass viele Leute dies nicht ästhetisch finden würden, aber es gibt Vorteile, wenn man mit einer Struktur arbeitet und die Eingabe-Array-Daten nicht kopieren muss. Ich kann Mitgliedsfunktionen in dieser Struktur definieren, um Skalar- und Vektorprodukte, Abstände usw. zu berechnen, was meinen Code viel verständlicher macht, als wenn ich mit Arrays arbeite.


Wie wäre es mit


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";
}

Funktioniert das auch garantiert oder könnte der Compiler etwas NACH den Datenmembern schreiben, sodass sizeof(A) > 3*sizeof(double) ? Und gibt es eine portable Möglichkeit, den Compiler daran zu hindern?


Einige Code-Antworten


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";
}
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";
}
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";
}