联合和共享数据字段(C++)
Unions and sharing data fields(C++)
在 SDL 的 API 文档中 Union event 它说字段类型在联合中的所有事件(对象)之间共享,这怎么可能?
例如,这是完全合法的
while(SDL_PollEvent(&event)){
if(event.type == SDL_KEYDOWN){
cout << "key down" << endl;
}
从逻辑上讲,这对我来说也更有意义,但我不确定第一个是否合法
while(SDL_PollEvent(&event)){
if(event.key.type == SDL_KEYDOWN){
cout << "key down" << endl;
}
联合有可能代表一个 多个可能 types/structures.
union {
int i;
float f;
char c;
};
在上面的例子中,持有并集的内存可以表示一个int
or一个float
or一个char
。但也只能是其中一个;他们是互斥的。联合重叠了每个成员使用的底层字节以节省 space,并假设您知道如何正确解释它。
(旁注:为了适应这一点,联合的 'size' - 存储联合的字节云 - 必须足够大以容纳联合中定义的最大可能类型。在在这种情况下,int 或 float 可能各为 4 个字节,因此联合至少为 4 个字节。)
这种重叠记忆的一个巧妙的副作用'trick';如果联合描述了多个 struct
成员,那么他们可以共享公共字段。
示例:
union {
struct {
int type;
int i;
} OPTION_INT;
struct {
int type;
float f;
} OPTION_FLOAT;
struct {
int type;
char c;
} OPTION_CHAR;
};
好的,整洁;联合可以代表三种可能结构中的任何一种。但是请注意;它们都包含完全相同的第一个成员 - type
。由于内存是 'overlapped' 的方式,OPTION_INT type
成员与 OPTION_FLOAT 和 OPTION_CHAR type
成员共享相同的内存。因此,无论哪个选项正确,type
成员应该始终存在。这是可能的,因为它们都将 type
字段定义为第一个成员。
工会 -- 爱上他们 :) Java 中没有真正的等价物,因此许多 Java 开发人员发现它们很奇怪。联合在概念上有点像抽象 class —— 单个联合可以将不同类型的数据打包到其中。数据类型通常具有某种父子继承关系——在这种情况下它们确实如此——但它们不是必需的。这并不罕见,例如,看到一个由整数和双精度组成的联合——在这种情况下,这不是一个包含整数 和 双精度的数据结构,但是在某个特定的内存块中包含 整数或双精度数的一个。实际使用的类型必须在 运行 时确定。
在这种情况下,SDL_Event 联合对许多不同类型的事件进行建模。第一个字段 type
指示应如何解释其余数据。如果类型是 SDL_KEYDOWN
,那么联合应该被解释为类型 SDL_KeyboardEvent 的结构。 SDL_KeyboardEvent 的第一个字段也是 type
—— 这在某种程度上是有道理的,因为它与 "base" SDL_Event 被打包到相同的 space 中。您可以将 type
(有点)想象成 "base" SDL_Event 的一个属性,它可以(某种程度上)由特定的子类型继承。我在这里有点华夫饼,因为类比并不是那么强烈。
在任何情况下,编译器都会确保 SDL_Event 足够大以存储它定义包含的任何不同结构。除了 type
之外,具体结构 SDL_DropEvent
、SDL_KeyboardEvent
等没有太多共同点,查看它们的定义就可以看出。
在 Java AWT 中,事件 classes 的作用与 SDL_Event union 在 SDL with C 中的作用几乎完全相同。
在 SDL 的 API 文档中 Union event 它说字段类型在联合中的所有事件(对象)之间共享,这怎么可能?
例如,这是完全合法的
while(SDL_PollEvent(&event)){
if(event.type == SDL_KEYDOWN){
cout << "key down" << endl;
}
从逻辑上讲,这对我来说也更有意义,但我不确定第一个是否合法
while(SDL_PollEvent(&event)){
if(event.key.type == SDL_KEYDOWN){
cout << "key down" << endl;
}
联合有可能代表一个 多个可能 types/structures.
union {
int i;
float f;
char c;
};
在上面的例子中,持有并集的内存可以表示一个int
or一个float
or一个char
。但也只能是其中一个;他们是互斥的。联合重叠了每个成员使用的底层字节以节省 space,并假设您知道如何正确解释它。
(旁注:为了适应这一点,联合的 'size' - 存储联合的字节云 - 必须足够大以容纳联合中定义的最大可能类型。在在这种情况下,int 或 float 可能各为 4 个字节,因此联合至少为 4 个字节。)
这种重叠记忆的一个巧妙的副作用'trick';如果联合描述了多个 struct
成员,那么他们可以共享公共字段。
示例:
union {
struct {
int type;
int i;
} OPTION_INT;
struct {
int type;
float f;
} OPTION_FLOAT;
struct {
int type;
char c;
} OPTION_CHAR;
};
好的,整洁;联合可以代表三种可能结构中的任何一种。但是请注意;它们都包含完全相同的第一个成员 - type
。由于内存是 'overlapped' 的方式,OPTION_INT type
成员与 OPTION_FLOAT 和 OPTION_CHAR type
成员共享相同的内存。因此,无论哪个选项正确,type
成员应该始终存在。这是可能的,因为它们都将 type
字段定义为第一个成员。
工会 -- 爱上他们 :) Java 中没有真正的等价物,因此许多 Java 开发人员发现它们很奇怪。联合在概念上有点像抽象 class —— 单个联合可以将不同类型的数据打包到其中。数据类型通常具有某种父子继承关系——在这种情况下它们确实如此——但它们不是必需的。这并不罕见,例如,看到一个由整数和双精度组成的联合——在这种情况下,这不是一个包含整数 和 双精度的数据结构,但是在某个特定的内存块中包含 整数或双精度数的一个。实际使用的类型必须在 运行 时确定。
在这种情况下,SDL_Event 联合对许多不同类型的事件进行建模。第一个字段 type
指示应如何解释其余数据。如果类型是 SDL_KEYDOWN
,那么联合应该被解释为类型 SDL_KeyboardEvent 的结构。 SDL_KeyboardEvent 的第一个字段也是 type
—— 这在某种程度上是有道理的,因为它与 "base" SDL_Event 被打包到相同的 space 中。您可以将 type
(有点)想象成 "base" SDL_Event 的一个属性,它可以(某种程度上)由特定的子类型继承。我在这里有点华夫饼,因为类比并不是那么强烈。
在任何情况下,编译器都会确保 SDL_Event 足够大以存储它定义包含的任何不同结构。除了 type
之外,具体结构 SDL_DropEvent
、SDL_KeyboardEvent
等没有太多共同点,查看它们的定义就可以看出。
在 Java AWT 中,事件 classes 的作用与 SDL_Event union 在 SDL with C 中的作用几乎完全相同。