4 General principles [intro]

4.4 The C++ memory model [intro.memory]

Фундаментальной единицей хранения в модели памяти C ++ является расширение byte. Байт, по крайней мере, достаточно велик, чтобы содержать любой член basic execution character set и восьмибитные кодовые единицы формы кодирования Unicode UTF-8, и состоит из непрерывной последовательности битов,4 количество которых определяется реализацией. Наименьший значащий бит называется low-order bit; самый старший бит называется high-order bit. Память, доступная программе C ++, состоит из одной или нескольких последовательностей смежных байтов. Каждый байт имеет уникальный адрес.

[ Note: Представление типов описано в [basic.types]. ] end note

A memory location - либо объект скалярного типа, либо максимальная последовательность смежных битовых полей, имеющих ненулевую ширину. [ Note: Различные функции языка, такие как ссылки и виртуальные функции, могут включать дополнительные области памяти, которые недоступны для программ, но управляются реализацией. ] Два или более могут обращаться к разным ячейкам памяти, не мешая друг другу. end note threads of execution

[ Note: Таким образом, битовое поле и соседнее небитовое поле находятся в разных ячейках памяти и, следовательно, могут одновременно обновляться двумя потоками выполнения без помех. То же самое относится к двум битовым полям, если одно объявлено внутри объявления вложенной структуры, а другое - нет, или если эти два разделены объявлением битового поля нулевой длины, или если они разделены небитовым -поле декларации. Одновременное обновление двух битовых полей в одной структуре небезопасно, если все поля между ними также являются битовыми полями ненулевой ширины. ] end note

[ Example: Структура, объявленная как

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 example

Число битов в байте сообщается макросом CHAR_­BIT в заголовке <climits>.