Модель памяти
Определяет семантику хранения компьютерной памяти в целях абстрактной машины C.
Данные, доступные программе C (память), представляют собой одну или несколько смежных последовательностей байтов. Каждый байт в памяти имеет уникальный адрес.
Байты
Байт — это наименьшая адресуемая единица памяти. Он определяется как смежная последовательность битов, достаточная для хранения любого члена базового набора символов выполнения (96 символов, которые должны быть однобайтовыми). C поддерживает байты размером 8 бит и более.
Типы char, unsigned char, и signed char используют один байт для хранения и представления значения. Количество бит в байте доступно как CHAR_BIT.
Для использования байтов для представления значений других основных типов (включая схемы организации памяти big-endian и little-endian) см. представление объекта
Местоположение в памяти
Местоположение в памяти — это
- объект скалярного типа (арифметический тип, указатель, тип перечисления)
- или самая большая смежная последовательность полей битов ненулевой длины
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 Потоки и гонки данныхПоток выполнения — это поток управления в программе, который начинается с вызова функции верхнего уровня Любой поток может потенциально получить доступ к любому объекту в программе (объекты с автоматическим и потоко-локальным временем хранения все еще могут быть доступны другому потоку через указатель). Разным потокам выполнения всегда разрешено одновременно обращаться (читать и изменять) разные места в памяти без каких-либо конфликтов и без требований к синхронизации. (Обратите внимание, что небезопасно одновременно обновлять два неатомарных поля битов в одном структуре, если все члены между ними также являются (ненулевой длины) полями битов, независимо от того, какими окажутся размеры этих промежуточных полей битов). Когда оценка выражения записывает значение в местоположение в памяти, а другая оценка читает или изменяет то же местоположение в памяти, выражения считаются конфликтующими. Программа, у которой есть две конфликтующие оценки, имеет гонку данных, если не выполняется ни одно из следующих условий:
Если возникает гонка данных, поведение программы не определено. (В частности, mtx_lock того же мьютекса другим потоком, что делает возможным использование блокировок мьютексов для защиты от гонок данных) Порядок памятиКогда поток считывает значение из места в памяти, он может увидеть начальное значение, значение, записанное в том же потоке, или значение, записанное в другом потоке. См. | (с C11) |
Ссылки
- Стандарт 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/w/c/language/memory_model