工会和共享数据字段(C )
Unions and sharing data fields(C++)
在联合事件的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_DropEvent
,SDL_KeyboardEvent
等,没有很多共同点,可以通过查看其定义可以看出。
在Java AWT中,活动类别的角色几乎与SDL_EVENT联合在SDL中的角色完全相同。
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何使用位字段将数据从二进制文件复制到结构中?
- 如何避免在数据结构中包含存储为字段的类?
- TOS字段从Linux的TCP插座上接收到的数据包获取
- 从数据集 Blob 字段中打开和编辑文件
- 将包含位字段和动态数据的结构复制到 Char 数组缓冲区中
- 如何为我的 Vulkan 类创建此通用数据结构字段
- 在Boost多索引容器中搜索位字段数据
- 如何从 GStreamer 管道读取数据中的特定字段
- 您将使用哪种数据模型在 QML 中制作二维字段 100*100
- C++ 中的 10 位或 12 位字段数据类型
- 使数据输入字段记住其值,从一次运行到下一次运行
- 在不模拟Ctrl+V的情况下将数据粘贴到任何应用程序输入字段中.Windows c++
- C++读取元数据文件,并处理由空白和:混合分隔的字段
- 基于多个字段搜索大型数据集的有效方法
- 为什么 C++ 类需要在类范围之外定义静态字段(数据成员)
- 使用 ADO 将原始文件数据插入访问表的 BLOB("OLE 对象")字段
- 原始数据包创建导致 IP 字段顺序不正确
- 难以读取的armadillo字段数据结构
- 在Visual Studio 2013中使用c++中的对象字段数据创建图表