当我使用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*
,这意味着它实际上不能与任何类型别名吗?
编译器警告消失了。在严格别名下,堆栈分配是否有影响?它是char[]
而不是char*
,这是否意味着它实际上无法与任何类型别名?
std::aligned_storage
来处理这个问题:http://en.cppreference.com/w/cpp/types/aligned_storage。 - mattnewport#pragma pack(1)
来使所有内容的对齐方式为 1,但这可能会给我带来更多的自由。 - Red Alert