Ответ 1
Прежде всего, см. главу §6.7.2.1, Спецификаторы структуры и объединения, P11. В нем говорится:
Реализация может выделять любой адресный блок хранения, достаточно большой для хранения битового поля. Если остается достаточно места, бит-поле, которое сразу же следует за другим битовым полем в структура должна быть упакована в соседние биты того же блока. [...]
Но в случае, если мы явно хотим, чтобы два последовательных элемента бит-поля, которые "могли быть" упакованы в одно место для хранения, чтобы находиться в отдельной ячейке памяти (то есть адресной единице хранения), вышеописанный способ принуждения Это.
Следующий параграф, P12, упоминает,
Объявление битового поля без декларатора, но только двоеточие и ширина, указывает на неназванное битовое поле. 126). В качестве особого случая элемент структуры битового поля с шириной 0 указывает, что никакое дополнительное битовое поле не должно быть упаковано в блок, в котором было добавлено предыдущее бит-поле, если оно есть.
следуя вашему примеру, это гарантирует, что два элемента битового поля, окружающие :0
, будут находиться в отдельной ячейке памяти (не внутри одного адресного блока хранения, даже если достаточное количество памяти осталось, чтобы упаковать их в один). Это имеет аналогичный эффект наличия члена, отличного от битового поля, между двумя битовыми полями, чтобы обеспечить разделение места памяти.
Цитата C11
, глава §3.14, NOTE 2
(выделено мной)
Битовое поле и соседний элемент небитового поля находятся в отдельных ячейках памяти. Такой же применяется к двум битовым полям, если объявлено внутри объявления вложенной структуры, а другое - нет или , если два разделены объявлением битового поля нулевой длины, или если они разделены членом небитового поля декларация.
Кроме того, в отношении использования ( "почему это необходимо" )
[...] Битовые поля
b
иc
не могут быть одновременно ноb
иa
, например, могут быть.
Приложение:
Что касается части concurrency, из ПРИМЕЧАНИЕ 1
Два потока выполнения могут обновлять и получать доступ к отдельным ячейкам памяти без вмешательства друг с другом.
и, из главы §5.1.2.4/P1,
В рамках размещенной реализации программа может иметь более одного потока выполнения (или поток) одновременно. [...]
Итак, это теоретически жизнеспособный вариант, согласно стандарту.