【发布时间】: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