- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我对 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
)决定了哪个字段是有效的,我们永远不需要实际存储 string
和 integer
字段。所以我们可以更改代码:
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/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!