访问POD结构数组作为其单个成员的数组是否违反了严格的别名?

ras*_*mus 11 c++ struct strict-aliasing c++11 c++03

我有整数值,用于访问不相关的数据存储中的数据,即句柄.我已选择将整数包装在结构中以便具有强类型对象,以便不能混合不同的整数.他们是,而且必须是POD.这就是我正在使用的:

struct Mesh {
    int handle;
};
struct Texture {
    int handle;
};
Run Code Online (Sandbox Code Playgroud)

我有这些句柄的数组,例如:Texture* textureHandles;.

有时我需要传递一个句柄数组int*来代码更通用的部分.现在我正在使用:

int* handles = &textureHandles->handle;
Run Code Online (Sandbox Code Playgroud)

它本质上是一个指向结构的第一个元素的指针,并将其解释为一个数组.

我的问题基本上是,如果这是合法的,或者如果它违反严格的别名来操纵int* handlesTexture* textureHandles指向同一个内存.我认为这应该是允许的,因为int在两种情况下都以相同的方式访问底层的type().我的保留与我通过获取一个结构中的成员的地址访问多个结构的事实有关.

作为我的第一个问题的延伸,以下是否可以?

int* handles = reinterpret_cast<int*>(textureHandles);
Run Code Online (Sandbox Code Playgroud)

小智 10

reinterpret_cast<int*>(textureHandles)绝对一样好&textureHandles->handle.标准中有一个特殊的例外,它继承自C even,它表示指向适当转换的标准布局结构的指针指向该结构的初始成员,反之亦然.

使用它来修改句柄也没关系.它不违反别名规则,因为您使用左值类型int来修改类型的子对象int.

虽然增加结果指针,并使用它来访问Texture对象数组中的其他元素,但有点不确定.Jerry Coffin已经指出有可能sizeof(Texture) > sizeof(int).尽管如此sizeof(Texture) == sizeof(int),指针算法仅定义为指向数组的指针(其中任意对象可被视为长度为1的数组).你没有int任何地方的数组,所以添加只是未定义.


Jer*_*fin 5

不,这不能保证有效.特别是,允许​​编译器在结构的任何元素之后插入填充,但不允许在数组的元素之间插入填充.

也就是说,只有一个元素的结构(类型int,或者至少一样大的元素,例如long),大多数编译器都不会插入任何填充的可能性很大,所以你当前的用法可能相当安全.规则.