名前空間
変種
操作

メモリモデル

From cppreference.com
< c‎ | language

C抽象機械の目的のために、コンピュータのメモリ記憶域のセマンティクスを定義します。

Cプログラムで利用可能なデータ記憶域(メモリ)は、1つ以上の連続したバイトのシーケンスです。メモリ内の各バイトは、一意のアドレスを持ちます。

目次

[編集] バイト

バイトは、メモリアドレスを指定できる最小単位です。これは、基本実行文字集合(シングルバイトであることが要求される96文字)の任意のメンバを保持するのに十分な大きさを持つ、連続したビットのシーケンスとして定義されます。Cは、8ビット以上のサイズのバイトをサポートします。

charunsigned char、および signed char は、記憶域と値表現の両方に1バイトを使用します。1バイトのビット数は 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 またはその他の手段によってトップレベル関数が呼び出されることで開始される、プログラム内の制御の流れです。

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

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

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

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

(特に、mtx_unlock は、別のスレッドによる同じミューテックスの mtx_lock同期し、したがってそれより先行発生します。これにより、ミューテックスロックを使用してデータ競合を防ぐことが可能になります)

メモリ順序

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

(C11 以降)

[編集] 参照

  • C23標準 (ISO/IEC 9899:2024)
  • 3.6 byte (p: TBD)
  • 3.14 memory location (p: TBD)
  • 5.1.2.4 Multi-threaded executions and data races (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 3.6 byte (p: TBD)
  • 3.14 memory location (p: TBD)
  • 5.1.2.4 Multi-threaded executions and data races (p: TBD)
  • C11標準 (ISO/IEC 9899:2011)
  • 3.6 byte (p: 4)
  • 3.14 memory location (p: 5)
  • 5.1.2.4 Multi-threaded executions and data races (p: 17-21)
  • C99標準 (ISO/IEC 9899:1999)
  • 3.6 byte (p: 4)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 1.6 DEFINITIONS OF TERMS

[編集] 関連項目

C++ documentation for Memory model
English 日本語 中文(简体) 中文(繁體)