Spec-Zone.ru › C

Модель памяти

Определяет семантику хранения данных в памяти компьютера для абстрактной машины 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

Потоки и гонки данных

Поток выполнения — это поток управления внутри программы, который начинается с вызова функции верхнего уровня посредством thrd_create или другим способом.

Любой поток потенциально может обращаться к любому объекту в программе (к объектам с автоматической и локальной для потока длительностью хранения по-прежнему может обращаться другой поток через указатель).

Разным потокам выполнения всегда разрешено одновременно обращаться (читать и изменять) к разным областям памяти без взаимного влияния и без необходимости синхронизации. (Обратите внимание: небезопасно одновременно обновлять два неатомарных битовых поля в одной структуре, если все члены, объявленные между ними, также являются битовыми полями ненулевой длины, независимо от размеров этих промежуточных битовых полей.)

Если при вычислении выражения производится запись в область памяти, а при другом вычислении выполняется чтение или изменение той же области памяти, говорят, что эти выражения конфликтуют. В программе с двумя конфликтующими вычислениями возникает гонка данных, если не выполняется ни одно из следующих условий:

  • оба конфликтующих вычисления являются атомарными операциями
  • одно из конфликтующих вычислений происходит до другого (см. memory_order)

При возникновении гонки данных поведение программы не определено. (В частности, mtx_unlock синхронизировано с, а следовательно, происходит до mtx_lock того же мьютекса другим потоком, что позволяет использовать блокировки мьютексов для предотвращения гонок данных.)

Порядок в памяти

При чтении значения из области памяти поток может увидеть начальное значение, значение, записанное в том же потоке, или значение, записанное в другом потоке. Подробности о порядке, в котором записи, сделанные потоками, становятся видимыми другим потокам, см. в memory_order.

(начиная с 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API