Namespaces
Variants

Memory model

From cppreference.net

Define las semánticas del almacenamiento en memoria de computadora para el propósito de la máquina abstracta de C.

El almacenamiento de datos (memoria) disponible para un programa C es una o más secuencias contiguas de bytes . Cada byte en la memoria tiene una única dirección .

Contenidos

Byte

Un byte es la unidad de memoria direccionable más pequeña. Se define como una secuencia contigua de bits, lo suficientemente grande para contener cualquier miembro del basic execution character set ( los 96 caracteres que se requieren que sean de un solo byte). C admite bytes de tamaños de 8 bits y superiores.

Los tipos char , unsigned char , y signed char utilizan un byte tanto para almacenamiento como para representación de valores . El número de bits en un byte es accesible como CHAR_BIT .

Para el uso de bytes para representar valores de otros tipos fundamentales (incluyendo diseños de memoria big-endian y little-endian), consulte object representation

Ubicación de memoria

Una ubicación de memoria es

  • un objeto de tipo escalar (tipo aritmético, tipo puntero, tipo enumeración)
  • o la secuencia contigua más larga de campos de bits de longitud no nula
struct S
{
    char a;     // ubicación de memoria #1
    int b : 5;  // ubicación de memoria #2
    int c : 11, // ubicación de memoria #2 (continuación)
          : 0,
        d : 8;  // ubicación de memoria #3
    struct
    {
        int ee : 8; // ubicación de memoria #4
    } e;
} obj; // El objeto 'obj' consiste en 4 ubicaciones de memoria separadas

Hilos y carreras de datos

Un hilo de ejecución es un flujo de control dentro de un programa que comienza con la invocación de una función de nivel superior mediante thrd_create u otros medios.

Cualquier hilo puede potencialmente acceder a cualquier objeto en el programa (los objetos con duración de almacenamiento automática y local de hilo aún pueden ser accedidos por otro hilo a través de un puntero).

Siempre se permite que diferentes hilos de ejecución accedan (lean y modifiquen) diferentes ubicaciones de memoria concurrentemente, sin interferencia y sin requisitos de sincronización. (nótese que no es seguro actualizar concurrentemente dos campos de bits no atómicos en la misma estructura si todos los miembros declarados entre ellos también son campos de bits (de longitud no cero), sin importar cuáles sean los tamaños de esos campos de bits intermedios)

Cuando una evaluación de una expresión escribe en una ubicación de memoria y otra evaluación lee o modifica la misma ubicación de memoria, se dice que las expresiones entran en conflicto . Un programa que tiene dos evaluaciones en conflicto tiene una carrera de datos a menos que:

Si ocurre una carrera de datos, el comportamiento del programa es indefinido.

(en particular, mtx_unlock está sincronizado-con , y por lo tanto, sucede-antes que mtx_lock del mismo mutex por otro hilo, lo que hace posible usar bloqueos de mutex para protegerse contra carreras de datos)

Orden de memoria

Cuando un hilo lee un valor de una ubicación de memoria, puede ver el valor inicial, el valor escrito en el mismo hilo o el valor escrito en otro hilo. Consulte memory_order para obtener detalles sobre el orden en que las escrituras realizadas desde hilos se vuelven visibles para otros hilos.

(desde C11)

Referencias

  • Estándar 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)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 3.6 byte (p: TBD)
  • 3.14 ubicación de memoria (p: TBD)
  • 5.1.2.4 Ejecuciones multi-hilo y carreras de datos (p: TBD)
  • Estándar 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)
  • Estándar C99 (ISO/IEC 9899:1999):
  • 3.6 byte (p: 4)
  • Estándar C89/C90 (ISO/IEC 9899:1990):
  • 1.6 DEFINICIONES DE TÉRMINOS

Véase también

Documentación de C++ para Modelo de memoria