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

时间:2017-10-05 19:30:43

标签: c++ sdl shared unions

Union event的SDL的API文档中,它表示字段类型在union中的所有事件(对象)之间共享,这怎么可能?

例如,这是完全合法的

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

2 个答案:

答案 0 :(得分:1)

联合有可能用多个可能的类型/结构来表示一个

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

在上面的示例中,保存联合的内存可以表示int a float a char 。但它只能是一个那些东西;他们是互相排斥的。联合重叠每个成员使用的底层字节以节省空间,并假设您将知道如何正确解释它。

(旁注:为了适应这种情况,联合的大小&#39; - 存储联合的字节云 - 必须足够大以容纳联合中定义的最大可能类型。在这种情况下,int或float每个都可以是4个字节,因此union最少为4个字节。)

这种重叠记忆的一个巧妙的副作用&#39;如果联盟描述了多个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字段定义为第一个成员。

答案 1 :(得分:0)

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

在这种情况下,SDL_Event联合模拟了许多不同类型的事件。第一个字段type表示应如何解释其余数据。如果类型为SDL_KEYDOWN,那么联合应该被解释为SDL_KeyboardEvent类型的结构。 SDL_KeyboardEvent的第一个字段也是type - 这是有道理的,因为它被打包到与&#34; base&#34;相同的空间中。 SDL_Event。您可以将type(一点点)视为&#34; base&#34;的属性。 SDL_Event,可以是(某种)由特定子类型继承的。我在这里有点狡猾,因为这个类比并不是那么强大。

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

在Java AWT中,事件类与SDL中使用SDL_Event联合执行的角色几乎完全相同。