Почему было бы предпочтительнее использовать группу анонимных структур над группой союзов? - PullRequest
1 голос
/ 15 октября 2019

Недавно я проверял исходный код GLM (Математическая библиотека OpenGL) И я заметил, что в их классе vec4 (начиная со строки 45) они что-то делаютинтересно. Давайте представим, что у меня есть vec4 с именем A. Чтобы получить поведение, в котором все Ax, Ar и As ссылаются на одно и то же значение (первый элемент vec4), а Ay, Ag и At ссылаются на второй элемент. и так далее, и так далее, GLM использует два подхода.

Во-первых, если анонимные структуры включены (я знаю, что iffy / будет зависеть от компилятора, если поддерживается ), GLM объявит класс с группировкой анонимных структур (давайте назовем этоПодход № 1):

union {
    struct { T x, y, z, w; };
    struct { T r, g, b, a; };
    struct { T s, t, p, q; };
};

Однако, если анонимные структуры не включены, они объявят класс таким же образом с анонимными объединениями (назовем этот Подход № 2):

union { T x, r, s; };
union { T y, g, t; };
union { T z, b, p; };
union { T w, a, q; };

Теперь подход IIRC II 1 является технически неопределенным поведением в C ++, но поддерживается многими компиляторами. Но Подход № 2 должен всегда работать. Но так как кажется, что GLM предпочитает более спорный подход № 1 с анонимными структурами, мне интересно, почему. Почему бы просто не всегда использовать более безопасный подход № 2? Существуют ли какие-либо различия в производительности, которые возникают при компиляции, во время выполнения или при использовании, которые отличаются между этими двумя подходами?

...