Какой подход лучше для представления цвета: использовать enum или struct?

Какая структура данных лучше использовать для хранения значений RGBA, чтобы повысить производительность: enum с переключением или структура SDL_Color в SDL?
  • 31 июля 2024 г. 5:23
Ответы на вопрос 3
Для представления цвета лучше использовать структуру, так как она позволяет хранить не только тип цвета, но и конкретные значения компонентов цвета (красный, зеленый, синий, альфа). 

Для хранения значений RGBA и повышения производительности лучше использовать структуру SDL_Color в SDL, так как она оптимизирована для работы с графикой и имеет оптимизированные методы доступа к компонентам цвета. Использование enum с переключением может быть менее эффективным и занимать больше памяти.
Как я понимаю через выше aligment тем лучше?

Нет. Это бред. Тут не применимы термины лучше/хуже.

Alignment (выравнивание) - это просто свойство типа данных.
enum по умолчанию имеет тип int, соответственно и все его свойства наследуются. В С++ (с версии 17, если не ошибоаюсь) можно самому выбрать тип enum. Для выравнивания обычно действует простое правило - тип должен быть выровнен в памяти на границу кратную его размеру. Например у int размер 4 байта (обычно), и выравнивание должно быть по границе 4 байт. у char/uint8_t - размер 1 байт, соответственно ограничений по выравниванию нет, т.е. выравнивание по границе байта. Тип SDL_Color - это, видимо, структура, состоящая из 4 uint8_t (или что там в SDL используют для unsigned char), выравнивание для структуры берется из типа ее первого поля (если аттрибутами не задано другое).
Используй типизированный в uint8_t enum и будет тебе счастье.
https://en.cppreference.com/w/cpp/language/enum

Кстати, выравнивание, это не ограничение С++ - это ограничение процессора на аппаратном уровне. Правда почти все современные процессоры уже не имеют этого ограничения и нормально жуют не выровненные типы, но при этом операции выполняют медленнее, чем с выровненными. Фактически процы просто научились "маскировать" это ограничение. Поэтому ограничение в языке осталось.
К тому же все еще есть процессоры, где требование выравнивания действует, но это в основном что-то из разряда микроконтроллеров. На таких процессорах использование не выровненных типов приводит к ошибке шины и вылету программы.
Обычно тебе не нужно думать про выравнивание, т.к. компилятор об этом позаботится за тебя. Но бывают ситуации, когда программист должен это учитывать. Например когда ты читаешь поток бинарных данных из сети или из файла, и данные в потоке - это что-то сложнее, чем байты и символы.
Вообще говоря, вкусовщина. align 4 означает выравнивание на границу слова, если там данных один байт, три пропадает. align 1 - никакого выравнивания, данные идут друг за другом. Но эффект (в виде разницы в требовании памяти) будет проявляться только при большом количестве обьектов данного типа (миллионы единиц).
Похожие вопросы