【发布时间】:2015-02-15 18:20:18
【问题描述】:
我有用于访问不相关数据存储(即句柄)中的数据的整数值。我选择将整数包装在一个结构中,以便拥有强类型对象,这样不同的整数就不会混淆。它们是而且必须是 POD。这就是我正在使用的:
struct Mesh {
int handle;
};
struct Texture {
int handle;
};
我有这些句柄的数组,例如:Texture* textureHandles;。
有时我需要将一组句柄作为int* 传递给代码的更通用部分。现在我正在使用:
int* handles = &textureHandles->handle;
它本质上接受一个指向结构的第一个元素的指针并将其解释为一个数组。
我的问题基本上是这是否合法,或者它是否违反了严格的别名来操纵 int* handles 和 Texture* textureHandles 指向同一内存。我认为应该允许这样做,因为在这两种情况下都以相同的方式访问底层类型 (int)。我的保留与我通过获取一个结构内成员的地址来访问多个结构这一事实有关。
作为我第一个问题的延伸,以下可以吗?
int* handles = reinterpret_cast<int*>(textureHandles);
【问题讨论】:
-
你想使用结构来获得强类型,然后你想抛弃类型来获得 int。你会得到两全其美的结果。
-
@NeilKirk 只有非常具体的函数才会使用原始 int* 数组。其余的将使用类型化结构。它们只是为了避免在一般情况下使用手柄时出错。
-
我认为你应该告诉我们更多关于你的实际项目,因为你的设计很奇怪。
-
@Neil Kirk 假设他正在使用 OpenGL(可能与 Direct3D 相同)。使用强类型会对您有所帮助,但归根结底,您仍然必须将 int(或 int 数组)传递给 API。如果它们是二进制相同的,则将 Texture 数组复制到 int 数组是不可取的。
-
@NeilKirk 这有什么奇怪的?当对象以一种语言出现在代码中但必须从另一种语言访问时,我在语言之间的所有接口中都做几乎完全相同的事情。 swig 生成的接口或多或少做同样的事情。 (句柄类型可能会有所不同:我的声明为
void*,而 IIRC,swig Java 接口使用long long。但想法是相同的:对象由句柄表示,句柄是某种允许查找的魔术 cookie对象。)
标签: c++ c++11 struct c++03 strict-aliasing