D 中的枚举与不可变

2024-03-14

有什么区别

enum i = 2;
enum s = "Hello";

and

immutable i = 2;
immutable s = "Hello";

在 D 2.0 中?


An enum是用户定义的类型,而不是变量。 enum e = 2;是一个 像这样的东西的简写enum : int { e = 2 }(即匿名 具有一名成员的枚举e), see 文档 http://www.digitalmars.com/d/2.0/enum.html。 根据定义,匿名枚举的所有成员都被放入当前 范围。所以,e是放置到当前作用域中的类型成员,其行为在当前作用域中 像一个literal http://en.wikipedia.org/wiki/Literal_%28computer_science%29. immutable i = 2;另一方面实际上创建了一个变量iint 类型。

这种差异会带来几个后果:

  • enum e将没有内存位置和地址(没有左值),因为 类型及其成员都没有地址。 IE。你不能做某事 喜欢auto ptr = &e;(就像你不能做的那样auto ptr = &2;). immutable i另一方面是普通变量(只是不可变)。
  • 正如乔纳森所讨论的 https://stackoverflow.com/questions/4790652/enum-vs-immutable-in-d/4790779#4790779, 不可变变量可以在编译时或运行时初始化, 而类型(及其定义该类型的所有成员)必须已知 编译时间。
  • 编译器可以简单地替换所有出现的e with 2. For i它 通常必须创建一个内存位置(尽管优化编译器 有时也许可以避免这种情况)。为此,期间的工作量 编译为enum预计会稍微低一些,并且 二进制稍微小一些。
  • 数组有一个令人惊讶的差异。为了enum uint[2] E = [0, 1]; and immutable uint[2] I = [0, 1];的访问权enum, e.g. E[0], 能 比immutable数组,例如I[0], 特别是作为数组E and I变得更大。之所以如此,是因为对于immutable数组,它只是一个普通的数组查找,比如说,一个全局的 多变的。为了enum但是看起来数组是每隔 使用前的时间,例如在全局函数内部enum(不 问我为什么,不过编译器好像真的只是简单的替换了外观 也具有本例中的值)。我从未尝试过,但我猜想 这同样适用于enum字符串和其他重要类型。

总结一下:当我使用编译时常量时,我​​通常采用enum除非 这些常量是数组,或者由于其他原因我需要一个内存位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

D 中的枚举与不可变 的相关文章

  • AS3/Flash/Flex 中的枚举? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 相对于 AS2 我真正喜欢 AS3 的一件事是它增加了多少编译时类型检查 然而 它似乎有些不足 因为没有可用的类型检查枚举结构 在 A
  • 定义一个数组,使用枚举变量作为数组大小

    使用枚举变量定义数组作为数组大小意味着什么 例如我有以下代码 typedef enum D ROM RDE GROUP 0 0x0 D ROM RDE GROUP 1 D ROM RDE MAX GROUPS E ROM RDE GROUP
  • 这个纯函数如何能够修改非私有状态?

    TDPL p 167 只要函数中的可变状态完全是暂时的 即在堆栈上分配 和private 即 不通过引用可能污染它的函数来传递 那么该函数可以被认为是纯函数 import std stdio writeln struct M int 4 d
  • 枚举和匹配属性的 C# 命名约定

    我经常发现自己实现了一个类 将某种自己的状态属性维护为枚举 我有一个 Status 枚举和一个 Status 类型的 Status 属性 我应该如何解决这个名称冲突 public class Car public enum Status O
  • 当您在 C# 中将枚举强制转换为 int 时,幕后会发生什么?

    我正在寻找用 C 实现模拟器 我考虑的事情之一是创建与其字节值关联的所有操作码的枚举 但是 我想知道考虑到我需要多久访问该字节值才能执行诸如将其用作查找表中的索引等操作 这是否不是一个好主意 当你将 enum 转换为 int 时 会发生什么
  • WCF 版本控制枚举

    我开始编写一些需要向前兼容和版本控制的 WCF 数据协定 我一直在阅读 MSDN 文章here http msdn microsoft com en us library ms733832 aspx 并且想知道是否有人对有关枚举的第 14
  • 如何将 ImmutableJS Map 与 TypeScript 结合使用

    我有一个看起来像这样的树结构 interface TreeData id number text string children TreeData 我想将其包装到一个不可变的映射中 但由于我使用的是 TypeScript 所以我希望使用 g
  • 在 C++ 中迭代连续枚举值的最简单方法[重复]

    这个问题在这里已经有答案了 什么是首选simple在 C 中迭代具有连续值的枚举的方法 我发现以前关于这个主题的问题涉及创建自定义operator 等等 但这似乎有点矫枉过正 到目前为止 我想出的最好的办法是 enum FOO BAR BL
  • 迭代非增量枚举

    在你问之前 我已经looked https stackoverflow com questions 261963 c iterate through an enum and looked https stackoverflow com qu
  • 时间:2019-03-17 标签:c#AlphaTelephoneNumberTranslator

    我有一个家庭作业 该程序将接受格式类似于 555 GET FOOD 的任何电话号码 任务是将字母映射到数字 并将数字翻译成其对应的数字 例如 A B C 2 D E F 3 ETC 目前我们还没有讨论类或创建地图 因此这些不是可行的解决方案
  • 将枚举元素分配给注释

    我想使用枚举元素作为注释属性的值 需要字符串值 因此 我创建了一个保存字符串常量的接口 public interface MyStringConstants public static final String COMPANY LOGIN
  • Android:枚举与静态最终整数?

    有什么优点 或缺点 enum与拥有一组static final intJava Android 应用程序中的s 是否存在有利于使用其中之一的效率或性能优化 我在意图 requestCodes 之类的上下文中提出这个问题 在 Android
  • Java 字符串可变性 - java.lang.NoSuchFieldException:偏移量

    我是 Java 新手 我看到了问答部分here http algs4 cs princeton edu 12oop 有两个删除可变性的示例 经测试可变字符串 java http algs4 cs princeton edu 12oop Mu
  • 为什么 CouchDB 使用仅追加 B+ 树而不是 HAMT

    我正在阅读数据结构 尤其是不可变的数据结构 例如仅追加 B 树 http guide couchdb org draft btree html用于 CouchDB 和哈希数组映射 trie http en wikipedia org wik
  • 只读有运行时开销吗?

    出于某种原因 我一直认为readonly字段有与其相关的开销 我认为这是 CLR 跟踪是否存在readonly字段是否已初始化 这里的开销是一些额外的内存使用量 用于跟踪状态以及分配值时的检查 也许我这么认为是因为我不知道readonly字
  • F#:仅对第一个事件执行一次操作,没有可变性/锁定?

    我有这段代码 可以下载文件并在控制台中告诉我该文件有多大 use webClient new WebClient let lockObj new Object let mutable firstProgressEvent true let
  • Gtk/GtkD 在窗口调整大小时检测鼠标按钮的释放?

    我正在尝试改进我用 GtkD Gtk 的 D 绑定 编写的绘图库 具有很多点的散点图需要很长时间才能调整大小 我想重新缩放图像 允许像素化 同时用户拖动窗口边缘来调整大小 并且仅在释放鼠标按钮时重新渲染它 是否有 API 可以检测在调整窗口
  • 打字稿中枚举声明中的方括号的含义是什么?

    我正在浏览一个名为 Angular ngrx 项目的打字稿文件collection ts在那里 我看到声明了以下枚举常量 import Action from ngrx store import Book from models book
  • 在Java中使用==而不是equals来比较不可变对象可以吗

    考虑调用静态工厂方法 valueOf 的两个 Integer 类型的引用 如下所示 Integer a Integer valueOf 10 Integer b Integer valueOf 10 考虑到Integer是不可变的 使用 而
  • Python 枚举子集迭代

    我想迭代以下枚举的子集 class Items enum Enum item1 0 item2 1 item3 2 item4 3 item5 4 item6 5 item7 6 item8 7 说我想 for item in Items

随机推荐

  • Bouncy Castle 在 CBC 模式下使用 AES 进行基于密码的加密

    我最近遇到了一段在 CBC 模式下使用 BouncyCastle 的 PBE 和 AES 的代码 PBEWithSHA1And256BitAES CBC BC public static final String ALGORITHM PBE
  • 给出很多间隔 [ai, bi],找到与最多间隔数相交的间隔

    给定很多间隔 ai bi 找到与间隔数量最多的间隔 我们能在 O nlogn 或更好的时间内做到这一点吗 我只能想到 n 2 方法 假设间隔给出为 a1 b1 an bn 制作一个长度已排序的数组2n关系被打破的地方 if ai aj 然后
  • PostgreSQL - jsonb_each

    我刚刚开始在 postgres 上使用 jsonb 并在网上很难找到示例 因为它是一个相对较新的概念 我尝试使用 jsonb each text 打印出键和值表 但在单列中获取 csv 我将下面的 json 保存为 jsonb 并用它来测试
  • ggplot 中仅一个图例的标签为斜体

    我正在尝试格式化一个侧面有两个独立图例的绘图 我有一个用于所有不同分类单元的形状图例 以及一个用于它们所属类别的颜色图例 我只想将形状图例中的分类单元名称斜体化 而不将颜色图例中的类别名称斜体化 到目前为止 我可以使用这一行将所有图例条目设
  • 如何以自定义方式从主题恢复全局存储?

    假设我在从主题获取数据后将数据存储在 Globalstore 中时正在进行一些自定义处理 即我正在根据 message 的值创建自定义键 在本地删除状态后 它会以相同的方式再次恢复 Globalstore 吗 override def pr
  • 无法在 Android Studio 中使用 compose 检查器 (Flamingo 2022.2.1)

    设备的网络正常工作 但如屏幕截图所示 我无法连接到以下 URL maven google com 导致撰写检查器无法正常工作 我尝试修改旧版本 Compose 的版本 但没有解决问题 我可以以某种方式设置 URL 或其他解决方案 以便我可以
  • 如何使用express启用cors nodejs?

    总之 我正在使用一个像 api 这样的 dicom 文件查看器 称为 Cornstone 为此 我连接到 dc4chee 的 WADO 服务来获取 dicom dcm4chee 运行端口 8080 而我在节点上的应用程序使用端口 3000
  • 加载.csv文件时如何将当前系统时间戳插入db2数据库基列

    下面的类将把 csv 导入到数据库表中 它工作正常 现在我需要更新同一个表中的另一列 其中当前系统时间戳需要获取 当该程序在数据库表的相应列中执行时得到更新 示例 在 Db2 表中 主题列为 英语社会数学时间戳 在 CSV 文件中只有 3
  • 实体框架代码优先迁移保留现有数据

    我正在使用 EF 6 1 并且对包含生产环境中的数据的现有数据库使用代码优先方法 是否有可能迁移模型更改并保留现有客户的数据 是的 但是 根据具体情况 更改的复杂性 它可能会很复杂 概述 https learn microsoft com
  • dojo 中的状态服务器端过滤

    我正在 dojo 1 10 版本的增强网格中进行服务器端过滤 Here https dojotoolkit org reference guide 1 10 dojox grid EnhancedGrid plugins Filter ht
  • 如何自动删除项目的所有system.out.println语句,包括所有多行Sop语句[重复]

    这个问题在这里已经有答案了 实际上我想自动化删除所有的过程System out println 在将项目交付给客户之前 对整个项目进行陈述 怎么做 按 ctrl H 转到文件搜索 将包含文本填充为System out println 文件名
  • 将 std::bind 与成员函数一起使用,该参数是否使用对象指针?

    使用时std bind要绑定成员函数 第一个参数是对象this指针 然而 它可以将对象作为指针传递 也可以不传递 例如 请参见以下程序 include
  • 使用转换后的边界进行布局

    我已经缩放了窗格中的一个节点 但窗格的布局考虑了边界 没有任何转换 我希望它考虑到转换后的边界 例如 和代码 import javafx application Application import javafx geometry Pos
  • 如何在 Postgres.app 中降级/使用以前版本的 Postgres DB

    我已经从这里安装了 Postgres app http postgresapp com http postgresapp com 几天以前 它附带 Postgres 9 4 4 今天我发现我使用的软件官方只支持Postgres 9 3 9
  • Javascript导入包无法解析模块说明符

    我正在尝试导入使用 npm 下载的模块 我的 json 文件是 name nodejs web app1 version 0 0 0 description NodejsWebApp1 main server js author name
  • 致命异常:iOS 上的 NSInternalInconsistencyException 崩溃

    几天来我一直在尝试重新创建和研究这个问题 但我不会去任何地方 这是堆栈跟踪 任何人都可以阐明正在发生的事情吗 我认为这与远程通知有关 不久前 当我安装 firebase sdk 时 问题就开始了 当时事故发生的次数并不多 但现在 事故发生的
  • 带有 pandas 数据框的子图

    我想使用 pandas 数据框 称为 df 在图上创建多个子图 我原来的情节在这里 df plot x month y number title open by month color blue 我在本网站的 使用图形和子图 部分尝试了多次
  • 我如何定义“其余宽度”?

    这是我的代码 function tags input on focusout function var txt this value replace a z0 9 ig allowed characters if txt span span
  • 如何运行 Spark Java 程序

    我为 Spark 编写了一个 Java 程序 但是如何从 Unix 命令行运行和编译它 编译运行时是否必须包含任何 jar 结合官方步骤快速入门指南 https spark apache org docs latest quick star
  • D 中的枚举与不可变

    有什么区别 enum i 2 enum s Hello and immutable i 2 immutable s Hello 在 D 2 0 中 An enum是用户定义的类型 而不是变量 enum e 2 是一个 像这样的东西的简写en