Я думаю, что ваша проблема не имеет ничего общего с негласным доступом, но с определением структуры. int
не обязательно длиной 32 бит. Согласно стандарту C, int имеет длину не менее 16 бит, а char имеет длину не менее 8 бит.
Моя догадка, Ваш компилятор оптимизирует TStruct так это выглядит следующим образом:
struct {
unsigned char B : 8;
unsigned int D : 24;
} ...;
При назначении 0x11223344
в Str.D
, чем в соответствии со стандартом C, компилятор должен сделать только в том, что по крайней мере 16 бит (0x3344
) записываются в Str.D
. Вы не указали, что Str.D
имеет длину 32 бит, только длина не менее 16 бит.
Ваш компилятор может также организовать-структуру, как это:
struct {
unsigned char B : 16;
unsigned int D : 16;
} ...;
B
по меньшей мере, 8 бит в длину, и D
длиной не менее 16 бит, все ок.
Возможно, что вы хотите сделать, это:
#include <stdint.h>
typedef struct {
uint8_t B;
uint32_t D;
} __attribute__((packed)) TStruct;
Таким образом, можно обеспечить 32-битное значение 0x11223344
правильно пишет Str.D
. Рекомендуется использовать типы с ограниченным размером для __packed structs.
Что касается неприсоединения доступа к члену внутри структуры, компилятор должен позаботиться об этом. Если компилятор знает определение структуры, то при обращении к Str.D
он должен позаботиться о любых невыложенных операциях доступа и бит/байт.
'' __attribute__ ((упакованный)) 'упакованный, кажется, запустил этот код, поэтому я бы сказал, что это ошибка в gcc, хотя ошибка связана с тем, что' Str' является неустойчивым. – nos
Если вы принудительно неравнозначные обращения к данной архитектуре, то вам лучше понять, как эта архитектура обрабатывает неуравновешенные нагрузки/хранилища. –
@PaulR gcc исправит это в таких случаях. Он знает о выравнивании архитектуры и генерирует код для выполнения правильных операций с битами при аннотации структуры с упакованными данными, например. (хотя он не будет исправлять ситуацию, если вы попытаетесь сохранить/загрузить такую структуру из, например, массива char). Очевидно, что добавление -fno-strict-volatile-bitfields будет «исправлять» код OP, но это сделает изменчивый классификатор сомнительной полезности – nos