【发布时间】:2015-01-17 11:38:48
【问题描述】:
这段代码是否违反了严格的别名规则:
int main()
{
short tab[] = {1,2,3,4};
int* ps = (int*)(&tab[0]);
int i = *ps;
}
我知道,如果这是相反的方式,那就是违规了
int main()
{
int tab[] = {1,2,3,4};
short* ps = (short*)(&tab[0]);
short s = *ps;
}
【问题讨论】:
-
您为什么认为这些案例不同?此外,代码实际上并没有访问任何值,您真的是在询问那些确切的代码片段还是更多涉及的内容?
-
AIUI,将任何指针类型转换为任何其他指针类型都是严格的别名违规,除非您在派生类型和基类型之间进行转换,或者在任何指针类型和
void*之间进行转换。 -
@cdhowie 演员阵容并非违规。访问存储的值是。还有比这两个更多的例外。
-
@ShafikYaghmour 是的,我忘了取消引用真正违反规则的指针,我认为这篇文章适用于被视为重复 - 现在一切都清楚了。
标签: c++ strict-aliasing