gpt4 book ai didi

c++ - union 正确用法

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:23:06 26 4
gpt4 key购买 nike

我对 union 体的理解是它的所有值都分配在同一个内存地址,并且内存空间与 union 体的最大成员一样大。但我不明白我们将如何实际使用它们。根据 The C++ Programming Language,这是一个最好使用 union 的代码.

enum Type { str, num };

struct Entry {
char* name;
Type t;
char* s; // use s if t==str
int i; // use i if t==num
};

void f(Entry* p)
{
if (p->t == str)
cout << p->s;
// ...
}

在此之后 Bjarne 说:

The members s and i can never be used at the same time, so space is wasted. It can be easily recovered by specifying that both should be members of a union, like this: union Value { char* s; int i; };The language doesn’t keep track of which kind of value is held by a union, so the programmer must do that: struct Entry { char* name; Type t; Value v; // use v.s if t==str; use v.i if t==num }; void f(Entry* p) { if (p->t == str) cout v.s; // ... }

谁能进一步解释生成的 union 代码?如果我们将其转变为 union 会实际发生什么?

最佳答案

假设您有一台 32 位机器,带有 32 位整数和指针。你的结构可能看起来像这样:

[0-3] name
[4-7] type
[8-11] string
[12-15] integer

那是 16 个字节,但是由于 type(代码中的 t)决定了哪个字段是有效的,我们永远不需要实际存储 stringinteger 字段。所以我们可以更改代码:

struct Entry {
char* name;
Type t;
union {
char* s; // use s if t==str
int i; // use i if t==num
} u;
};

现在的布局是:

[0-3] name
[4-7] type
[8-11] string
[8-11] integer

在 C++ 中,无论你最近分配给什么,都是 union 的“有效”成员,但没有办法知道哪一个是本质上的,所以你必须自己存储它。这种技术通常称为“区分 union ”,“区分器”是 type 字段。

因此第二个结构占用 12 个字节而不是 16 个字节。如果您要存储大量它们,或者它们来自网络或磁盘,您可能会关心这一点。否则,这并不重要。

关于c++ - union 正确用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27519837/

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