工会和共享数据字段(C )

Unions and sharing data fields(C++)

本文关键字:字段 数据 共享      更新时间:2023-10-16

在联合事件的SDL的API文档中,它说该字段类型是在联盟中的所有事件(对象)中共享的,该怎么可能?

也是如此,这是完全合法的

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;
   }

一个联合有可能在中表示一个多个可能的类型/结构。

union {
  int i;
  float f;
  char c;
};

在上面的示例中,持有联合的内存可以代表int a float a char。但这只能是一个。它们在千方百计的排他性中。联盟重叠每个成员为了节省空间而使用的基础字节,并假设您将知道如何正确解释它。

(旁注:为了适应这一点,联盟的"大小" - 联盟存储的字节云 - 必须足够大才能容纳联盟定义的最大类型。在这种情况下,INT或浮点每个字节可能是4个字节,因此联盟将至少为4个字节。)

这个重叠的内存"技巧"的一个整洁的副作用;如果工会描述了多个struct成员,则可以共享共同的字段。

示例:

union {
  struct {
    int type;
    int i;
  } OPTION_INT;
  struct {
    int type;
    float f;
  } OPTION_FLOAT;
  struct {
    int type;
    char c;
  } OPTION_CHAR;
};

好吧,整洁;工会可以代表三个可能的结构中的任何一个。但是请注意;它们都包含完全相同的第一个成员-type。由于内存"重叠"的方式,Option_INT type成员与option_float和option_char type成员共享了相同的内存。因此,无论哪种选项正确,type成员都应始终存在。这是可能的,因为它们都将type字段定义为第一个成员。

工会 - 必须爱情'em :) Java没有真正的等效物,因此许多Java开发人员发现它们很奇特。从概念上讲,工会有点像一个抽象类 - 单个联合可以包含不同的数据。数据类型通常具有某种亲子的继承关系 - 它们在这种情况下是这样的 - 但并不需要。例如,看到由整数和双重组成的联合并不罕见 - 在这种情况下,这不是包含整数 and 的数据结构,而是包含一个数据结构在某些特定的内存中,是整数或双人。实际使用的类型必须在运行时确定。

在这种情况下,SDL_Event Union建模了许多不同类型的事件。第一个字段type指示如何解释其余数据。如果类型为SDL_KEYDOWN,则应将联合解释为类型SDL_KeyboardEvent的结构。SDL_KeyboardEvent的第一个字段也是type-这是有意义的,因为它与"基础" SDL_EVENT相同的空间包装。您可以将type(一点)想象成" base" sdl_event的属性,可以(某种)特定子类型继承。我在这里有点笨拙,因为类比并不是那么强大。

在任何情况下,编译器都将确保SDL_EVENT足够大,可以存储其定义要包含的任何不同结构。除了type除了特定的结构SDL_DropEventSDL_KeyboardEvent等,没有很多共同点,可以通过查看其定义可以看出。

在Java AWT中,活动类别的角色几乎与SDL_EVENT联合在SDL中的角色完全相同。