ProEns08 ProEns08 - 3 months ago 18
C++ Question

Could Qt Synchronisation classes be used with MSVC compiler

In the Qt Synchronizing threads documentation listed here:

http://doc.qt.io/qt-5/threads-synchronizing.html

They wrote:


Note: Qt's synchronization classes rely on the use of properly aligned pointers. For instance, you cannot use packed classes with MSVC.


The sentence is not clear.

Which are the limitations of using Qt Synchronization classes with MSVC compiler?

Answer

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 float).

Another way in which this can occur is casting a random char* to 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 (!)

Comments