Namespaces
Variants

Memory model

From cppreference.net

C抽象機械の目的におけるコンピュータメモリストレージのセマンティクスを定義します。

Cプログラムが利用可能なデータストレージ(メモリ)は、1つ以上の連続した byte のシーケンスです。メモリ内の各byteには一意の address が割り当てられています。

目次

翻訳の説明: - 「Contents」→「目次」に翻訳 - C++専門用語(Byte, Memory location, Threads and data races, Memory order)は原文のまま保持 - HTMLタグ、属性、構造は完全に保持 - 番号付けや書式は変更なし - 技術文書に適した正確で専門的な翻訳を実施

バイト

byte はメモリの最小アドレス可能単位です。これは連続したビット列として定義され、 basic execution character set 96文字の必須シングルバイト文字 )の任意のメンバーを保持できる十分な大きさを持ちます。C言語は8ビット以上のサイズのバイトをサポートしています。

types char unsigned char 、および signed char は、ストレージと value representation の両方に1バイトを使用します。バイト内のビット数は CHAR_BIT としてアクセス可能です。

他の基本型の値を表現するためのバイトの使用(ビッグエンディアンとリトルエンディアンのメモリレイアウトを含む)については、 object representation を参照してください

メモリ位置

メモリ位置

struct S
{
    char a;     // メモリ位置 #1
    int b : 5;  // メモリ位置 #2
    int c : 11, // メモリ位置 #2 (続き)
          : 0,
        d : 8;  // メモリ位置 #3
    struct
    {
        int ee : 8; // メモリ位置 #4
    } e;
} obj; // オブジェクト 'obj' は4つの独立したメモリ位置で構成される

スレッドとデータ競合

実行スレッドとは、プログラム内の制御フローのことで、 thrd_create または他の手段によってトップレベル関数の呼び出しから開始されます。

任意のスレッドは、プログラム内の任意のオブジェクトにアクセスする可能性があります(自動記憶域期間およびスレッドローカル記憶域期間を持つオブジェクトは、ポインタを通じて他のスレッドからアクセスされる可能性があります)。

異なる実行スレッドが、異なる メモリ位置 に同時に(読み取りおよび変更)アクセスすることは、常に許可されており、干渉や同期の要件はありません。(ただし、同じ構造体内の2つの非アトミックビットフィールドを同時に更新することは安全ではありません。それらの間に宣言されたすべてのメンバーが(非ゼロ長の)ビットフィールドである場合、それらの中間ビットフィールドのサイズに関係なく)

式の 評価 がメモリ位置に書き込みを行い、別の評価が同じメモリ位置を読み取りまたは変更する場合、それらの式は 競合 していると言います。2つの競合する評価を持つプログラムは、以下のいずれかの条件を満たさない限り データ競合 を持ちます:

データ競合が発生した場合、プログラムの動作は未定義です。

(特に、 mtx_unlock synchronized-with 関係にあり、したがって、同じミューテックスの happens-before mtx_lock に対して他のスレッドで発生するため、ミューテックスロックを使用してデータ競合を防ぐことが可能です)

メモリ順序

スレッドがメモリ位置から値を読み取る場合、初期値、同じスレッドで書き込まれた値、または別のスレッドで書き込まれた値が見える可能性があります。スレッドからの書き込みが他のスレッドに可視になる順序の詳細については、 memory_order を参照してください。

(C11以降)

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 3.6 バイト (p: TBD)
  • 3.14 メモリロケーション (p: TBD)
  • 5.1.2.4 マルチスレッド実行とデータ競合 (p: TBD)
  • C17規格 (ISO/IEC 9899:2018):
  • 3.6 byte (p: TBD)
  • 3.14 memory location (p: TBD)
  • 5.1.2.4 マルチスレッド実行とデータ競合 (p: TBD)
  • 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++ ドキュメント Memory model に関する記述