在此处列出的Qt Synchronizing threads文档中:
http://doc.qt.io/qt-5/threads-synchronizing.html
他们写道:
注意:Qt的同步类依赖于使用正确对齐的指针。例如,您不能将压缩类与MSVC一起使用。
句子不清楚。
将Qt同步类与MSVC编译器一起使用有哪些限制?
答案 0 :(得分:3)
您正面临文档错误,并提供以下修复:
注意:Qt的同步类依赖于使用正确对齐的指针。例如,你不能在带有MSVC 的打包类
中使用它们。
MSVC是一只红鲱鱼。 Qt的同步类不适用于打包结构期间,在所有平台上都支持Qt - 因为所有这些平台都支持打包结构,并且知道如何访问此类结构的未对齐成员。
答案 1 :(得分:2)
如果您不使用打包课程(如果您不知道您可能不会使用它们的话),那么这不应该是一个问题。
请点击此处查看有关内容的信息:Class contiguous data
答案 2 :(得分:2)
对齐是指对某些类型的对象地址的限制。对于Qt支持的编译器,只有一种对齐限制:某些地址应该是2,4或8的倍数。
有几种方法可以违反此限制。在打包课程中,当您有float
后跟char
后跟另一个float
时,三个成员之间将没有间隙(这就是为什么他们被称为打包)。结果,第二个float
的地址比第一个高出5。很明显,两个地址中的一个不是4的倍数(float
的对齐)。
另一种可能发生这种情况的方法是将随机char*
投射到float*
。在这种情况下,char*
的最后两位应为零。
MSVC ++可以处理这样的未对齐数据(它只是稍微慢一些),但它是通过让CPU在两个操作中加载数据来实现的。这会破坏Qt的同步,该同步假定数据在一个操作中加载,这样您就可以获得旧值或新值。如果在两个操作中拆分负载,则第一个可以看到旧值,第二个可以看到新值。结果是寄存器包含旧位和新位的组合(!)