Swift 枚举是如何在内部实现的?

问题描述

我最近问了一个关于 generic enum/structs in C 的问题,并意识到尽管我提出了与 enum 可能性的比较,例如Swift 和 Rust,我真的不明白这些语言在内部是如何处理的。

对于 Rust,我发现了一篇(相当迂回的)文章标题Peeking inside a Rust enum — 寻找“但 Rust 枚举不仅如此”。标题,然后继续滚动直到“在 Rust 中,它被称为判别式”。部分。最终,这部分基本上是说 Rust 枚举有点等同于 C 中的类似内容

struct {
   enum actual_options discriminant;
   union {
      /* … varIoUs data types/sub-structs corresponding to each option's need… */
   };
};

它与引擎盖下的 Swift enum 基本相同吗? IE。我应该期望枚举与枚举中最大可能选项的结构具有基本相同的内存开销,加上至少一个额外字节来存储总体 case标记/判别式?

我还对生成什么代码使用任何类型的底层结构感兴趣。我假设它不会比你在 C 中为上面显示的结构所做的更花哨/优化吗?例如

struct raw_enum {
   enum { case1,case2,case3 } tag;
   union {
      struct { int x; int y; } case1_data;
      const char* case2_data;
      struct { float a; double b; void* c; char d; } case3_data;
   };
};


struct raw_enum d;
fill_in_some_value(&d);
if (d.tag == case1) {
  // use `d.case1_data`…
} else if (d.tag == case2) {
  // use `d.case2_data`…
} else if (d.tag == case3) {
  // use `d.case3_data`…
} else {
  // any runtime assertion for an unkNown tag that Could somehow sneak in???
}

这是 Swift 在围绕枚举生成代码中所做的合理近似吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)