On Mon, Jun 17, 2013 at 01:27:38PM +0100, Julian Brown wrote: > Well -- I'm certainly no expert on the C++ memory model, but I am under > the impression (that I can't seem to verify by googling ;-)) that > accesses to adjacent bitfields during volatile access of a particular > bitfield are forbidden. So simply, for the following: > > struct foo { > int a : 8; > int b : 8; > int c : 16; > }; > > volatile struct foo x; > > void bar (void) { x.b++; }
I believe in the above it is ok in C++ memory model if the RMW cycle is using 32-bit type, but in struct foo { int a : 8; int b : 8; char c, d; }; volatile struct foo x; void bar (void) { x.b++; } it is not (but it is laid out the same), because modification to x.a or x.b must not create data races on x.c and/or x.d. Jakub