Каково выравнивание по умолчанию глобальных переменных, которые являются объединениями или структурами. Гарантировано ли, что они будут выровнены по словам? В частности, при использовании GCC и SDCC.
В коде функция f()
безопасна или она может вызвать невыровненный доступ? Есть ли разница между 16-битной и 32-битной платформами?
#define ADDR_SIZE 8
typedef union {
unsigned char u8[ADDR_SIZE];
} addr_t;
addr_t global_address;
void f(void) {
uint32_t x = *((uint32_t *)&global_address) + *((uint32_t *)&global_address + 1);
}
uint32_t
. Глобальная переменная, представляющая собой объединение, приводится к типуuint32_t
. - person kfx   schedule 08.10.2015global_address
превращается вuint32_t *
- person LPs   schedule 08.10.2015uint32_t
, чтобы вы не выполняли приведение явно, и чтобы компилятор со 100% уверенностью знал, что объединение должно быть выровнено для поддержкиuint32_t
?union
с одним членом довольно глупо. - person ShadowRanger   schedule 08.10.2015#defines
могут быть и другие члены, это просто не имеет отношения к вопросу. - person kfx   schedule 08.10.2015uint32_t *
, в частности, является ложным, поэтому неактуальным и дезинформативным ... К этому приводится address переменной. - person kfx   schedule 08.10.2015