Memory model
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 datosUn 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 memoriaCuando 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
|