名稱空間
變體
操作

記憶體模型

來自 cppreference.com
< c‎ | 語言

定義了計算機記憶體儲存的語義,以用於 C 抽象機。

C 程式可用的資料儲存(記憶體)是一個或多個連續的位元組序列。記憶體中的每個位元組都有一個唯一的地址

目錄

[編輯] 位元組

一個位元組是記憶體中最小的可定址單位。它被定義為連續的位序列,其大小足以容納基本執行字元集的任何成員(96 個字元,它們被要求是單位元組的)。C 支援 8 位及更大尺寸的位元組。

型別 charunsigned charsigned char 在儲存和值表示上都使用一個位元組。一個位元組中的位數可以透過 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 位元組(p: 待定)
  • 3.14 記憶體位置(p: 待定)
  • 5.1.2.4 多執行緒執行和資料競爭(p: 待定)
  • C17 標準 (ISO/IEC 9899:2018)
  • 3.6 位元組(p: 待定)
  • 3.14 記憶體位置(p: 待定)
  • 5.1.2.4 多執行緒執行和資料競爭(p: 待定)
  • C11 標準 (ISO/IEC 9899:2011)
  • 3.6 位元組(p: 4)
  • 3.14 記憶體位置(p: 5)
  • 5.1.2.4 多執行緒執行和資料競爭(p: 17-21)
  • C99 標準 (ISO/IEC 9899:1999)
  • 3.6 位元組(p: 4)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 1.6 術語定義

[編輯] 另請參見

C++ 文件 關於 記憶體模型