有多少内存使用字节枚举,这是否优化了 C# 中的内存/速度?

2024-01-04

在 C# 中使用字节枚举进行小型枚举是一种好处还是一种好的做法?

这会减少内存使用吗?

这能提高速度吗?

Example:

enum Fruits : byte { Apple, Orange, Banana }

相比之下有什么优势:

enum Fruits { Apple, Orange, Banana }

提前致谢。


使用 Visual Studio 机器代码窗口进行调查

For byte enum and int enum我们可以看到内存是对齐的4 bytes在每种情况下,在 Windows x64 上,甚至使用Flags属性。但long enum消耗8 bytes每个值。

因此没有必要使用字节枚举,因为它消耗相同的内存并且速度相同,并且使用字节对齐应该仅在 8 位机器上有用。

解释

这是因为 .NET 在 x32 以及 x64 Intel/AMD 上使用 32 位寄存器来存储整数,即使对于 AnyCPU 或 x64 目标也是如此。

.NET 编译器不会优化内存,而是会优化速度,因为处理器内部总线大小在 x32 CPU 上优化为 (16/)32 位,在 x64 CPU 上优化为 (32/)64 位。因此,32 位访问是 x32 上的最佳速度,64 位访问是 x64 上的最佳速度。任何其他尺寸都会“强制”处理器减小/增大尺寸。我写了 (16/) 和 (32/),因为这些访问经过优化,比其他缩小/放大大小的速度要慢。

这是因为 .NET 编译器更看重速度而不是内存,特别是因为它是虚拟机,因此比本机代码慢。出于兼容性原因,它更倾向于 32 位。事实上,32 位寄存器和内存访问在 x32/x64 机器上更加优化,较低的对齐会导致性能损失(除非我们有 8 位或 16 位处理器)。如果编译为 AnyCPU 或面向 x64,则仅内存指针在 x32 上为 32,在 x64 上为 64。

因此,现在任何短于 32 位的数据都应该与 32 位对齐,将来可能会是 64 位。

因此,比整数短的枚举以及结构和类中小于或等于 4 字节大小的整数值是 4 字节对齐的,因此我们在 x32 或 x64 下的 .NET 机器上每个字节丢失 3 个字节,除非我们修改结构包装尺寸 https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.structlayoutattribute.pack(默认为 4 个字节)。

Remark

A 元帅尺寸 https://learn.microsoft.com/dotnet/api/system.runtime.interopservices.marshal.sizeof在结构或类实例上给出“已使用的(非托管)数据大小”,但不是真正的保留内存,包括用于存储数据的丢失块。

Example

enum FruitsByte : byte { Apple, Orange, Banana }
enum FruitsInt { Apple, Orange, Banana }
enum FruitsLong : long { Apple, Orange, Banana }

For byte

var fb1 = FruitsByte.Apple;
mov dword ptr [rbp+0A4h],ecx  

var fb2 = FruitsByte.Orange;
mov dword ptr [rbp+0A0h],1  

0xA4 - 0xA0 = 4 bytes

For int

var fi1 = FruitsInt.Apple;
mov dword ptr [rbp+9Ch],ecx  

var fi2 = FruitsInt.Orange;
mov dword ptr [rbp+98h],1  

0x9C - 0x98 = 4 bytes

For long

var fl1 = FruitsLong.Apple;
mov qword ptr [rbp+90h],rcx  

var fl2 = FruitsLong.Orange;
mov qword ptr [rbp+88h],rcx  

0x90 - 0x88 = 8 bytes

完整机器码

      var fb1 = FruitsByte.Apple;
00007FF7E93C0B19  xor         ecx,ecx  
00007FF7E93C0B1B  mov         dword ptr [rbp+0A4h],ecx  
      var fb2 = FruitsByte.Orange;
00007FF7E93C0B21  mov         dword ptr [rbp+0A0h],1  

      var fi1 = FruitsInt.Apple;
00007FF7E93C0B2B  mov         dword ptr [rbp+9Ch],ecx  
      var fi2 = FruitsInt.Orange;
00007FF7E93C0B31  mov         dword ptr [rbp+98h],1  

      var fl1 = FruitsLong.Apple;
00007FF7E93C0B3B  movsxd      rcx,ecx  
00007FF7E93C0B3E  mov         qword ptr [rbp+90h],rcx  
      var fl2 = FruitsLong.Orange;
00007FF7E93C0B45  mov         ecx,1  
00007FF7E93C0B4A  movsxd      rcx,ecx  
00007FF7E93C0B4D  mov         qword ptr [rbp+88h],rcx  

更多信息

数据结构对齐(维基百科) https://en.wikipedia.org/wiki/Data_structure_alignment

x64 架构 - CPU 寄存器 (MSDoc) https://learn.microsoft.com/windows-hardware/drivers/debugger/x64-architecture

8086 至 i486 指令集 https://www.ordisoftware.com/files/intel/Intel-Instructions-8086-to-i486.pdf

英特尔® 64 和 IA-32 架构软件开发人员手册 https://software.intel.com/content/www/us/en/develop/articles/intel-sdm.html

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

有多少内存使用字节枚举,这是否优化了 C# 中的内存/速度? 的相关文章

  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 访问者和模板化虚拟方法

    在一个典型的实现中Visitor模式 该类必须考虑基类的所有变体 后代 在许多情况下 访问者中的相同方法内容应用于不同的方法 在这种情况下 模板化的虚拟方法是理想的选择 但目前这是不允许的 那么 模板化方法可以用来解析父类的虚方法吗 鉴于
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • C 语言中 =+(等于加)是什么意思?

    我碰到 与标准相反 今天在一些 C 代码中 我不太确定这里发生了什么 我在文档中也找不到它 In ancientC 版本 相当于 它的残余物与最早的恐龙骨头一起被发现 例如 B 引入了广义赋值运算符 使用x y to add y to x
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 获取 2 个数据集 c# 中的差异

    我正在编写一个简短的算法 它必须比较两个数据集 以便可以进一步处理两者之间的差异 我尝试通过合并这两个数据集并将结果更改放入新的数据集来实现此目标 我的方法如下所示 private DataSet ComputateDiff DataSet
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 使用 C# 从 DateTime 获取日期

    愚蠢的问题 给定日期时间中的日期 我知道它是星期二 例如我如何知道它的 tue 2 和 mon 1 等 Thanks 您正在寻找星期几 http msdn microsoft com en us library system datetim
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 是否可以在 C# 中强制接口实现为虚拟?

    我今天遇到了一个问题 试图重写尚未声明为虚拟的接口方法的实现 在这种情况下 我无法更改接口或基本实现 而必须尝试其他方法 但我想知道是否有一种方法可以强制类使用虚拟方法实现接口 Example interface IBuilder
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 让整个CSS表变得很重要!

    有没有办法让整个 CSS 样式表优先于另一个样式表 我知道你可以做到这一点 重要的是 但我可以用一行来做到这一点 而不是修改工作表上的所有数千个属性吗 Thanks 确保您想要的样式表最后调用 或者您想要的特定样式最后调用 例如 使用这个
  • 使用带有正则表达式的字典(Scala?)的 PySpark UDF 优化挑战

    我正在尝试优化下面的代码 PySpark UDF 它为我提供了所需的结果 基于我的数据集 但在非常大的数据集 大约 180M 上速度太慢 结果 准确度 优于可用的 Python 模块 例如 geotext hdx python countr
  • 如何使用ReportingService2010?

    我正在尝试使用报告服务器 Web 服务通过代码部署报告服务器解决方案 http 服务器名称 ReportServer ReportService2010 asmx wsdl http Server Name ReportServer Rep
  • 从 mongodb 数组中删除元素

    我是 mongodb 的新手 我想删除数组中的某些元素 我的文件如下 id ObjectId 4d525ab2924f0000000022ad name hello time stamp 2010 07 01T12 01 03 75 02
  • 覆盖 matplotlib 的平移工具 (wx)

    我正在使用 wxPython 面板中的 matplotlib 来执行一些繁重的绘图 我的问题是在使用本机平移工具时出现的 当您拖动平移手柄时 似乎 matplotlib 试图不断重绘画布 随着我绘制的数据量变得非常不稳定 已经使用数据集合等
  • 使用 AND 和 OR 运算符的 Solr 字段查询 (fq)

    我一直在努力使用 AND 和 OR 运算符形成 solr 字段查询 为什么 solr 对于 1 和 2 3 和 4 查询返回不同的结果 即使所有查询都有相同的逻辑 fq 名称 abc AND 城市 1 3 OR 名称 abc AND loc
  • 无法访问developer.apple.com 中的证书、标识符和配置文件

    我正在尝试遵循以下内容有效的配置文件均不包含设备 https stackoverflow com questions 28585821 none of the valid provisioning profiles include the
  • tkinter GUI 写入文本小部件并替换文本

    from tkinter import from tkinter import ttk parent Tk p ttk Panedwindow parent orient HORIZONTAL p pack fill BOTH expand
  • 无法访问已处置的对象。对象名称:FileBufferingReadStream

    我正在尝试在天蓝色中上传文件 所以基本上我正在尝试将文件转换为流 以便我可以在服务器上创建一个文件并写入其数据 public async Task UploadFileOnAzure string path string name IFor
  • 从外部文件调用 jQuery 日期选择器

    我对 jQuery 比较陌生 并且很难让 jQuery 日期选择器从外部 js 文件工作 最初 我将脚本创建为函数 但认为这样做会限制范围 并且无法在函数外部访问它 我还尝试将其定义为函数 并命名该函数 然后使用 document read
  • 允许用户在 iOS 应用程序内切换应用程序跟踪同意状态

    如何使用户能够从菜单中轻松切换同意inside具有新的应用程序跟踪透明度要求的实时 iOS 应用程序 我曾经通过复选标记按钮来跟踪用户同意情况 而无需 Apple 的 ATT 要求 我还可以使用此同意状态吗 我可以通过网络视图跟踪同意吗 T
  • 时差节目

    我正在使用以下函数来计算时差 它没有显示正确的输出 1 个月的时差后显示 2 分钟的差异 我的程序出了什么问题 public String TimestampDiff Timestamp t long t1 t getTime String
  • 打开新窗口时,Visual Studio 中的 Silverlight 调试停止工作

    我有一个托管 silverlight 应用程序的 aspx 页面 调试工作正常 当我直接转到页面时 silverlight 应用程序中的断点会被命中 但是当我从其托管 ASP NET 应用程序在新窗口中启动页面时 断点将停止被命中 有任何想
  • Zend_db 更新更好的错误报告

    当我更新记录时 我使用 更新 的结果来确定它是否正常工作 a this gt db gt insert self TABLE saveData a 1 表示更新了一条记录 a 0 表示它没有更新任何内容 如果表格没有任何改变 我可以得到 0
  • C 和 C++ 中的声明/定义作为语句

    当这不能在 C 中编译时我很困惑 int main for int i 0 i lt 4 i int a 5 A dependent statement may not be declaration return 0 我习惯了 C 来编译它
  • 为什么我使用 UpdateSourceTrigger=PropertyChanged ,TwoWay 还不够?

    你好 有源和目标文本框 txttarget 与 txtsource 绑定 当在 txtsource 中写入内容时 txttarget 发生了变化 一切都很好 但是在 txttarget 上写入时 我没有看到 txttarget 有任何变化
  • 四开不渲染

    我的四开文档突然停止渲染 我已重新安装 RStudio 和 quarto 软件包 但此问题仍然存在 当我打开新的四开文档时 我不再在新文档中看到样板材料 该文档是空的 就像我选择了一样Create Empty Document 但我没有 然
  • Spyder默认模块导入列表

    我正在尝试设置一个稍微定制的 Spyder 版本 当 Spyder 启动时 它会自动导入一长串模块 包括来自 matplotlib numpy scipy 等的模块 有没有办法将我自己的模块添加到该列表中 为了以防万一 我使用 Python
  • Linux:杀死后台任务

    如何终止 Linux 中最后生成的后台任务 Example doSomething doAnotherThing doB doC doD kill doB 你可以通过工作号码杀人 当您将任务置于后台时 您会看到类似以下内容的内容 scrip
  • 有多少内存使用字节枚举,这是否优化了 C# 中的内存/速度?

    在 C 中使用字节枚举进行小型枚举是一种好处还是一种好的做法 这会减少内存使用吗 这能提高速度吗 Example enum Fruits byte Apple Orange Banana 相比之下有什么优势 enum Fruits Appl