这段代码违反了严格的混叠规则

This piece of code breaks strict aliasing rule?

本文关键字:规则 段代码 代码      更新时间:2023-10-16

我读了https://www.qt.io/blog/2011/06/10/type-punning-and-strict-aliasing,找到了这段代码

QDataStream &QDataStream::operator>>(qint16 &i)
{
...
        register uchar *p = (uchar *)(&i);
        char b[2];
        if (dev->read(b, 2) == 2) {
            *p++ = b[1];
            *p = b[0];
...

作者声称MSVC优化了我觉得很奇怪的赋值。

MSVC真的利用严格的混叠规则吗?

uchar*不是特别允许用来做双关语吗?

这要么是编译器的错误,要么是调用该方法的代码中的错误。"严格混叠规则"允许使用字符类型访问对象i引用,而不管该对象的实际类型是什么。调用此方法的代码实际上甚至不必传递对与qint16兼容的对象的引用,以使此函数具有已定义的行为。