这段代码违反了严格的混叠规则
This piece of code breaks strict aliasing rule?
我读了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
兼容的对象的引用,以使此函数具有已定义的行为。
相关文章:
- 在java中解决这段代码时面临循环中的问题
- 我是如何在这段代码中出现分段错误的
- 我不明白这段代码是如何对这个pythonlist()进行排序的,也不明白如何用C++中的向量来重现它
- 为什么这段代码不起作用,我该如何解决?
- 为什么这段代码给我错误? 有没有自错?
- 有人可以解释一下这段代码如何能够反转字符串
- 可能我知道为什么这段代码没有给出任何输出吗?
- 这段代码的最后一行在做什么?
- 我不知道为什么这段代码会让核心被转储?
- 我试图用这段代码找到二叉树的高度,但它一直返回 0,有人可以告诉我为什么吗?
- 有人可以向我解释一下这段代码的作用吗?
- 存储在哪个内存段(代码/数据段)类(员工)中?
- 为什么这段代码会导致无限循环?
- 任何人都可以弄清楚这段代码如何显示运行错误?它打印无限时间 -1 以及正确答案
- 如何为一段代码启用 -permissive
- 谁能告诉我为什么这段代码没有产生正确的输出?
- 我想反转我的阵列.为什么这段代码给出垃圾值?
- 使用Qt Creator在调试模式下编译一段代码
- 有没有办法使这段代码更快?
- 这段代码违反了严格的混叠规则