Предположим, у меня есть структура, будь то объединение или иное:
typedef struct {
union {
struct { float x, y, z; } xyz;
struct { float r, g, b; } rgb;
float xyz[3];
} notAnonymous;
} Vector3;
Я слышал, что некоторые компиляторы автоматически дополняют структуры для повышения производительности, создавая границы, выровненные по словам.
Предположительно такая синергия означает, что размер структуры не может быть гарантированно равен сумме размеров полей ее компонентов, и поэтому существует изменение повреждения данных и/или переполнения для массива xyzs
в следующем:
inline Vector3 v3Make(float x, float y, float z) { Vector3 v = {x,y,z}; return v; }
float xyzs[6];
*(Vector3*)&xyzs[3] = v3Make(4.0f,5.0f,6.0f);
*(Vector3*)&xyzs[0] = v3Make(1.0f,2.0f,3.0f);
Правильный?