Предположим, у меня есть структура, будь то объединение или нет:
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);
Правильно?