In the Qt Synchronizing threads documentation listed here:
Note: Qt's synchronization classes rely on the use of properly aligned pointers. For instance, you cannot use packed classes with MSVC.
Alignment refers to a restriction on the addresses of objects of certain types. For the compilers supported by Qt, there's just one sort of alignment restriction: some addresses should be a multiple of 2,4 or 8.
There are a few ways in which this restriction can be violated. In a packed class, when you have a
float followed by a
char followed by another
float there will be no gaps between the three members (that's why they're called packed). As a result, the second
float has an address that's 5 higher than the first. It's fairly obvious that one of the two addresses is not a multiple of 4 (the alignment of
Another way in which this can occur is casting a random
float*. The last two bits of the
char* should be zero in this case.
MSVC++ can deal with such unaligned data (it's just slightly slower), but it does so by having the CPU load the data in two operations. This breaks Qt's synchronization which assumes that data is loaded in one operation, such that you get either an old or a new value. If the load is split in two operations, the first may see an old value and the second a new value. The result is that the register contains a mix of old and new bits (!)