这段代码打破了严格的别名规则?

时间:2014-08-17 09:00:37

标签: c++ strict-aliasing

我看了http://blog.qt.digia.com/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 *进行打字?

1 个答案:

答案 0 :(得分:1)

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