Ответ 1
Это безопасно. Цитирование С++ 11:
[intro.memory] р3:
Место памяти - это либо объект скалярного типа, либо максимальная последовательность смежных битовых полей, имеющих ненулевую ширину. [Примечание. Различные функции языка, такие как ссылки и виртуальные функции, могут включать дополнительные ячейки памяти, которые недоступны для программ, но управляются реализацией. -end note] Два потока выполнения (1.10) могут обновлять и получать доступ к отдельным ячейкам памяти, не мешая друг другу.
[intro.memory] р5:
[Пример: структура, объявленная как
struct {
char a;
int b:5,
c:11,
:0,
d:8;
struct {int ee:8;} e;
}
содержит четыре отдельных ячейки памяти: поле
a
и бит-поляd
иe.ee
являются отдельными ячейками памяти и могут быть изменены одновременно, не мешая друг другу. Битовые поляb
иc
вместе составляют четвертую ячейку памяти. Битовые поляb
иc
не могут быть одновременно изменены, но могут быть, например,b
иa
. -end пример]
Они означают, что члены a
и b
of X
являются отдельными ячейками памяти и могут быть доступны одновременно.