fields campos campo c c99 bit-fields sequence-points c11

campos - campo de bits en c



Campos de bits y puntos de secuencia (2)

C11 considera que los campos de bits con nombre adyacentes forman parte de la misma ubicación de memoria. No se garantiza que dichos campos de bits se actualicen atómicamente, en otras palabras, si una actualización no está secuenciada explícitamente antes que la otra, el comportamiento no está definido. 3.14 memory location también tiene una explicación detallada de cuándo se puede considerar que dos campos están en diferentes ubicaciones de la memoria, por lo que las actualizaciones de los mismos pueden considerarse de forma independiente.

Si quisieras modificar tu estructura.

struct S0 { unsigned f0:4; int :0; signed f1:4; } l_62;

de modo que exista este extraño "separador de ubicación de memoria" entre los dos campos de bits, se garantizará que su código sea correcto.

Para C99 el caso parece ser más complicado, no existe un concepto tan detallado de la ubicación de la memoria. En una discusión reciente en la lista de correo del kernel de Linux, hubo una afirmación de que, en general, para todos los pares de campos de bits habría una garantía de atomicidad al actualizar cualquiera de ellos. El punto de partida de esa discusión fue un caso en el que gcc contaminó un campo que no es de bit y que se encuentra junto a un campo de bit de una manera inesperada que lleva a fallas falsas.

Para una implementación que empaqueta f0 y f1 en el mismo byte, ¿se define el siguiente programa?

struct S0 { unsigned f0:4; signed f1:4; } l_62; int main (void) { (l_62.f0 = 0) + (l_62.f1 = 0); return 0; }

Me interesa la respuesta para C99 y para C11 si hay razones para pensar que allí es diferente.

En C99, todo lo que encontré fue 6.5: 2:

Entre el punto de secuencia anterior y el siguiente, un objeto tendrá su valor almacenado modificado a lo sumo una vez por la evaluación de una expresión. [...]

No me queda claro qué consecuencias tiene este párrafo en el programa anterior.

Sobre la base de un gran número de pruebas aleatorias, la mayoría de los compiladores parecen generar código donde las dos asignaciones no interfieren.


La tarea aquí es para los miembros de la estructura. El hecho de que compartan el mismo almacenamiento no debería tener ningún efecto en la lógica. De hecho, no has hecho una asignación a la misma cosa.

Por supuesto, no soy un abogado de idiomas.