Модель памяти
Определяет семантику хранения данных в памяти компьютера для абстрактной машины C.
Хранилище данных (память), доступное программе на C, представляет собой одну или несколько непрерывных последовательностей байтов. Каждый байт в памяти имеет уникальный адрес.
Байт
Байт — это наименьшая адресуемая единица памяти. Он определяется как непрерывная последовательность битов, достаточная для хранения любого символа из базового набора символов выполнения (96 символов, которые должны представляться одним байтом). C поддерживает байты размером 8 бит и более.
Типы char, unsignedchar и signedchar используют один байт как для хранения, так и для представления значения. Число битов в байте доступно через CHAR_BIT.
Сведения об использовании байтов для представления значений других фундаментальных типов (в том числе о расположении данных в памяти в форматах с прямым и обратным порядком байтов) см. в разделе представление объекта
Область памяти
Область памяти — это
- объект скалярного типа (арифметического типа, типа указателя, перечисляемого типа)
- или наибольшая непрерывная последовательность битовых полей ненулевой длины
struct S
{
char a; // memory location #1
int b : 5; // memory location #2
int c : 11, // memory location #2 (continued)
: 0,
d : 8; // memory location #3
struct
{
int ee : 8; // memory location #4
} e;
} obj; // The object 'obj' consists of 4 separate memory locations
Потоки и гонки данныхПоток выполнения — это поток управления внутри программы, который начинается с вызова функции верхнего уровня посредством Любой поток потенциально может обращаться к любому объекту в программе (к объектам с автоматической и локальной для потока длительностью хранения по-прежнему может обращаться другой поток через указатель). Разным потокам выполнения всегда разрешено одновременно обращаться (читать и изменять) к разным областям памяти без взаимного влияния и без необходимости синхронизации. (Обратите внимание: небезопасно одновременно обновлять два неатомарных битовых поля в одной структуре, если все члены, объявленные между ними, также являются битовыми полями ненулевой длины, независимо от размеров этих промежуточных битовых полей.) Если при вычислении выражения производится запись в область памяти, а при другом вычислении выполняется чтение или изменение той же области памяти, говорят, что эти выражения конфликтуют. В программе с двумя конфликтующими вычислениями возникает гонка данных, если не выполняется ни одно из следующих условий:
При возникновении гонки данных поведение программы не определено. (В частности, Порядок в памятиПри чтении значения из области памяти поток может увидеть начальное значение, значение, записанное в том же потоке, или значение, записанное в другом потоке. Подробности о порядке, в котором записи, сделанные потоками, становятся видимыми другим потокам, см. в | (начиная с C11) |
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 3.6 байт (стр.: TBD)
- 3.14 область памяти (стр.: TBD)
- 5.1.2.4 Многопоточное выполнение и гонки данных (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 3.6 байт (стр.: TBD)
- 3.14 область памяти (стр.: TBD)
- 5.1.2.4 Многопоточное выполнение и гонки данных (стр.: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
- 3.6 байт (стр.: 4)
- 3.14 область памяти (стр.: 5)
- 5.1.2.4 Многопоточное выполнение и гонки данных (стр.: 17–21)
- Стандарт C99 (ISO/IEC 9899:1999):
- 3.6 байт (стр.: 4)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 1.6 ОПРЕДЕЛЕНИЯ ТЕРМИНОВ
См. также
| Документация по C++ о модели памяти |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/language/memory_model