Qt Synchronization类可以与MSVC编译器一起使用吗?

时间:2016-08-31 13:27:24

标签: c++ multithreading visual-studio qt visual-c++

在此处列出的Qt Synchronizing threads文档中:

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

他们写道:

  

注意:Qt的同步类依赖于使用正确对齐的指针。例如,您不能将压缩类与MSVC一起使用。

句子不清楚。

将Qt同步类与MSVC编译器一起使用有哪些限制?

3 个答案:

答案 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的同步,该同步假定数据在一个操作中加载,这样您就可以获得旧值或新值。如果在两个操作中拆分负载,则第一个可以看到旧值,第二个可以看到新值。结果是寄存器包含旧位和新位的组合(!)