Ответ 1
Независимо от системы, этот код компилируется или выполняется, будут ли поля в анонимной структуре всегда совпадать с индексами в colorChannels?
Не обязательно. Реализация может добавлять байты "отступы" между отдельными переменными struct
. "Заполнение" - это всего лишь дополнительные байты памяти, вставленные в определение памяти между переменными или в конце struct
в соответствии с реализацией. Если это произошло, то ваш целочисленный массив не будет совмещен с макетом памяти struct
(если, например, дополнение не было только в конце struct
). Порядок переменных в struct
в памяти должен быть согласованным во всех реализациях (в этой переменной a
будет следовать b
, за которым следует c
в памяти), но, опять же, заполнение байтов между ними может быть там (например, за a
следует b
в памяти, но есть отступы между a
и b
, так что они не сразу после друг друга в памяти).
Для некоторых компиляторов, таких как gcc, есть способы изменить, как он обрабатывает дополнение. Это может помочь гарантировать, что struct
будет в выравнивании памяти с вашим целым массивом, но это может вызвать проблемы с памятью ниже по течению.
Другими словами, спецификация требует, чтобы адрес памяти myColor.colorChannels [0] был таким же, как адрес myColor.red?
Если между red
, green
и blue
от struct
нет отступов, то индексы colorChannels
будут соответствовать каждой переменной в памяти.