gpt4 book ai didi

c++ - union 和共享数据字段(C++)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:08:02 25 4
gpt4 key购买 nike

在 SDL 的 API 文档中 Union event它说字段类型在 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;
}

最佳答案

union 有可能代表多种类型/结构中的一种

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

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

(旁注:为了适应这一点, union 的“大小”——存储 union 的字节云——必须足够大以容纳 union 中定义的最大可能类型。在这种情况下,int or float 可以各为 4 个字节,因此 union 至少为 4 个字节。)

这种重叠内存“技巧”的一个巧妙的副作用;如果 union 描述多个 struct 成员,那么它们可以共享公共(public)字段。

例子:

union {
struct {
int type;
int i;
} OPTION_INT;

struct {
int type;
float f;
} OPTION_FLOAT;

struct {
int type;
char c;
} OPTION_CHAR;
};

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

关于c++ - union 和共享数据字段(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46593462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com