【发布时间】:2015-01-16 04:43:36
【问题描述】:
当我使用 g++ 编译此示例代码时,我收到以下警告:
警告:取消引用类型双关指针将破坏严格别名规则
[-Wstrict-aliasing]
代码:
#include <iostream>
int main()
{
alignas(int) char data[sizeof(int)];
int *myInt = new (data) int;
*myInt = 34;
std::cout << *reinterpret_cast<int*>(data);
}
在这种情况下,data 不是为 int 别名,因此将其转换回 int 不会违反严格的别名规则吗?还是我在这里遗漏了什么?
编辑:奇怪,当我这样定义 data 时:
alignas(int) char* data = new char[sizeof(int)];
编译器警告消失。堆栈分配对严格别名有影响吗?它是 char[] 而不是 char* 这一事实是否意味着它实际上不能为任何类型起别名?
【问题讨论】:
-
@molbdnilo char * 总是可以别名
-
@ShafikYaghmour 是的,当然。我怎么会忘记?
-
可能是因为
data已经是&data[0]的别名?int const * data;也更接近于int data[1]; -
您可能需要考虑为此使用
std::aligned_storage:en.cppreference.com/w/cpp/types/aligned_storage -
为什么自 gcc 7.2 以来警告完全消失了?直播(godbolt.org/g/ci5dKj)
标签: c++ language-lawyer strict-aliasing