【问题标题】:This piece of code breaks strict aliasing rule?这段代码违反了严格的别名规则?
【发布时间】:2014-08-17 09:00:36
【问题描述】:

我读过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* 不是特别允许用来做类型双关吗?

【问题讨论】:

  • 你不说版本。但根据微软 STL 的评论。 MSVC 不使用严格的别名。 See here
  • 我不怎么用MSVC,也不知道各个版本的MSVC有什么区别。但不知何故,我的印象是他们没有利用未定义的行为。例如,我从未听说过由 MSVC 引起的整数溢出问题。
  • 我相信这段代码没问题。如果这导致 MSVC 出现问题,那么这是编译器错误。

标签: c++ strict-aliasing


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 2015-01-16
    • 2017-02-25
    • 2016-10-09
    • 1970-01-01
    相关资源
    最近更新 更多