Int16 - .net 中的字节容量?

2023-11-22

为什么 :

short a=0;
Console.Write(Marshal.SizeOf(a));

shows 2

但如果我看到 IL 代码,我会看到:

/*1*/   IL_0000:  ldc.i4.0    
/*2*/   IL_0001:  stloc.0     
/*3*/   IL_0002:  ldloc.0     
/*4*/   IL_0003:  box         System.Int16
/*5*/   IL_0008:  call        System.Runtime.InteropServices.Marshal.SizeOf
/*6*/   IL_000D:  call        System.Console.Write

第 1 行的 LDC 表示:

将 0 压入堆栈,如下所示int32.

所以一定有4占用的字节数。

But sizeOf shows 2字节...

我在这里缺少什么? Short 在内存中实际占用多少字节?

我听说过一种情况,填充为 4 个字节,这样处理起来会更快。这里也是这样吗?

(请忽略syncRoot和GC根标志字节,我只是问2 vs 4)


CLI 规范对于允许在堆栈上的数据类型非常明确。短 16 位整数不是其中之一,因此此类类型的整数在加载到堆栈时会转换为 32 位整数(4 个字节)。

第 III.1.1 部分包含所有详细信息:

1.1 数据类型

CTS 定义了丰富的类型系统,CLS 指定了可用于语言的子集 互操作性方面,CLI 本身处理一组简单得多的类型。这些类型包括用户定义的值 类型和内置类型的子集。该子集统称为“基本 CLI 类型”,包含 以下类型:

  • 完整数字类型的子集 (int32, int64, native int, and F).
  • 对象引用(O) 不区分引用的对象类型。
  • 指针类型(native unsigned int and &) 不区分所指向的类型。

注意对象引用和指针类型都可以赋值null。在整个 CLI 中,该值被定义为零(全位为零的位模式)。

1.1.1 数字数据类型

  • CLI 仅对数字类型进行操作int32(4 字节有符号整数),int64(8 字节 有符号整数),native int(本机大小整数),以及F(本机大小浮点 数字)。但是,CIL 指令集允许实现其他数据类型:

  • 短整数:计算堆栈仅保存 4 或 8 字节整数,但其他位置 (参数、局部变量、静态变量、数组元素、字段)可以保存 1 或 2 字节整数。为了 bool 和 char 类型堆栈操作的目的是 分别视为无符号 1 字节和 2 字节整数。从这些位置加载到 堆栈通过以下方式将它们转换为 4 字节值:

    • 对 unsigned int8、unsigned int16、bool 和 char 类型进行零扩展;
    • int8 和 int16 类型的符号扩展;
    • 无符号间接和元素加载的零扩展(ldind.u*, ldelem.u*, ETC。);;和
    • 符号扩展用于有符号间接和元素加载(ldind.i*, ldelem.i*, etc.)

存储为整数、布尔值和字符 (stloc, stfld, stind.i1, stelem.i2等)截断。使用conv.ovf.*用于检测此截断何时导致无法正确表示原始值的值的指令。

[注意:短整数(即 1 字节和 2 字节)在所有体系结构上都作为 4 字节数字加载,并且这些 4 字节数字始终与 8 字节数字不同地被跟踪。这通过确保默认的算术行为(即,当没有conv or conv.ovf指令被执行)将在所有实现上产生相同的结果。]

产生短整数值的转换指令实际上留下了一个int32(32 位)值在堆栈上,但保证只有低位有意义(即,对于无符号转换,较高有效位全部为零,对于有符号转换,则为符号扩展)。为了正确模拟完整的短整数运算集,需要在执行之前转换为短整数。div, rem, shr, 比较 和条件分支指令。

…等等。

推测起来,这个决定可能是为了架构简单性或速度(或可能两者兼而有之)。现代 32 位和 64 位处理器处理 32 位整数比处理 16 位整数更有效,并且由于所有可以用 2 字节表示的整数也可以用 4 字节表示,因此这种行为是合理的。

使用 2 字节整数而不是 4 字节整数真正有意义的唯一情况是,如果您更关心内存使用而不是执行速度/效率。在这种情况下,您需要拥有一大堆这些值,可能会打包到一个结构中。那就是你关心结果的时候Marshal.SizeOf.

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

Int16 - .net 中的字节容量? 的相关文章

  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • C++ 指针和对象实例化

    这有效 MyObject o o new MyObject 而这并不 MyObject o new MyObject Why 关键词new 返回一个指针 http msdn microsoft com en us library kewsb
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • QSpinBox 输入 NaN 作为有效值

    我正在尝试扩展 QSpinBox 以能够输入 NaN 或 nan 作为有效值 根据文档 我应该使用 textFromValue valueFromText 和 validate 函数来完成此操作 但我无法让它工作 因为它仍然不允许我输入除数
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • ASP.NET MVC 动作过滤器

    有谁知道即使在 CATCH 块中 ActionFilterAttribute 类的 OnResultExecuted 方法是否也会执行 ie CookiesActions public ActionResult Login Usuarios
  • 列表到优先队列

    我有一个 C 大学编程项目 分为两个部分 在开始第二部分时应该使用priority queues hash tables and BST s 我 至少 在优先级队列方面遇到了麻烦 因为它迫使我自己重做第一部分中已经实现的许多代码 该项目是关
  • 如何在 C++ 运行时更改 QML 对象的属性?

    我想在运行时更改 QML 对象的文本 我尝试如下 但文本仍然为空 这是后端类 class BackEnd public QObject Q OBJECT Q PROPERTY QString userFieldText READ userF
  • 查找方法不适用于 EF6.1 模拟

    我已经使用这些 msdn 指南设置了模拟 使用模拟框架进行测试 EF6 及以上 http msdn microsoft com en us data dn314429 var bsAc db BusAcnts FirstOrDefault
  • Control.Invoke 是否泵送消息?

    Control Invoke 在被阻塞时是否继续在调用它的线程中泵送消息 系统 Windows 窗体 不会 Invoke 是阻塞的 整个线程将阻塞 直到对 Invoke 的调用返回 还有开始调用 http msdn microsoft co
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如何重用具有稍微不同的 ProcessStartInfo 实例的 Process 实例?

    我有以下开始的代码robocopy https technet microsoft com en us library cc733145 aspx as a Process 我还需要进行数据库查询以确定每次需要复制哪些目录robocopy被
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 使用任务的经典永无止境的线程循环?

    给出了一个非常常见的线程场景 宣言 private Thread thread private bool isRunning false Start thread new Thread gt NeverEndingProc thread S
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir

随机推荐

  • 如何使用 CSS 将图像大小调整为其自身的百分比?

    我正在尝试使用图像本身的百分比来调整图像的大小 例如 我只想将图像大小调整为 50 将图像缩小一半 但申请width 50 会将图像大小调整为容器元素 可能是父元素 的 50 例如 问题是 我可以在不使用 JavaScript 或服务器端的
  • 如何使用 micrometer-brave 在 spring-cloud-gateway 中获取trace-id

    我想在 Spring Cloud Gateway 中的每个请求的日志中显示traceId 然而 traceId和spanId只是空的 日志配置如下 logging pattern level 5p TRACE ID X traceId SP
  • ServiceStack.Redis:无法连接:sPort:0

    有时 并非总是 我得到 无法连接 sPort 0 使用 ServiceStack Redis 时尝试从 Redis 获取值时出错 有谁知道这可能意味着什么 我正在使用 PooledRedisClientManager 来获取客户端 我相信你
  • Firebase 3.0 令牌:[错误:Firebase Auth ID 令牌没有“kid”声明]

    我目前正在使用 firebase 3 0 开发一个 node js 服务 该服务由使用 firebase 2 4 的 Web 应用程序调用 我正在发送当前用户Firebase ID 令牌 Auth getAuth token 在我的标头调用
  • ng14 中具有强类型表单的 FormBuilder

    我有以下表格 const enum Fields FirstName firstName LastName lastName interface FormType Fields FirstName FormControl
  • 检索安全描述符并获取 FileSystemRights 编号

    Using Get Acl我正在尝试获取文件夹的访问权限 问题是 对于某些组 我得到的是号码而不是访问类型 下面的例子 get acl C TestFolder access FileSystemRights 536805376 Acces
  • Laravel 5.6 getRouteKeyName() 不起作用

    这是我到目前为止的代码 Web php Route get uri PageController show gt name page show 页面控制器 Show the requested page public function sh
  • 将 .jar 转换为 OSX 可执行文件?

    我制作了一个 Java 应用程序 我想在 Windows OSX 和 Linux 上分发它 而不分发 jar 文件 我使用了很棒的 Windows exe 包装器http launch4j sourceforge net 创建一个包含我的图
  • Android ListView 具有多种布局

    我必须显示具有不同类型视图的列表 所以我必须定义一个带有适配器的 ListView 我必须在其中扩展多个视图 我已经经历过example给定 但问题是我的列表不对称 就像示例中每次在 4 个项目后重复标题一样 所以我面临着重复使用物品的问题
  • 如何在跨文件预处理时获取唯一值

    PROBLEM 我需要一种使用预处理器指令生成唯一值的方法 目的是每次调用宏时 它都会有一个唯一的integral标识符 但它应该在文件中保留其价值 有点像预处理器计数器 用于记录调用函数的次数 更多信息 我使用的宏是 define LOG
  • 使用通用可选参数的 Typescript 函数重载

    我正在尝试编写一个高阶函数来包装输入函数并缓存最近调用的结果作为副作用 基本功能 withCache 看起来像这样 function cache key string value any Some caching logic goes he
  • 为什么我无法使用索引器将项目添加到通用列表?

    这是我今天看到的一个奇怪的情况 我有一个通用列表 我想使用它的索引器将项目添加到我的列表中 如下所示 List
  • Docker PHP 7.1 imagick

    Docker php 7 1 imagick pecl install imagick docker php ext enable imagick 软件包 pecl php net imagick 没有可用的版本 安装失败 错误 服务 应用
  • 通过 .NET 确定每个查询的 DocumentDB 请求费用

    我试图弄清楚在通过提供的 NET 客户端库执行 DocumentDB 查询请求时是否可以获得 请求费用 详细信息返回到底层 HTTP 标头 x ms request charge 中 我可以通过 Fiddler 等进行监控 但如果我可以直接
  • Python:pip 尝试安装到 /bin 目录

    我安装了 pythonbrew install python which pip usr local bin pip my PYTHONPATH shows usr local lib python2 7 site packages 但是
  • Symfony2 自定义存储库类

    我是 symfony2 的新手 我正在尝试创建自定义存储库类 但无法做到 这是我正在做的事情 我向实体类 手机 添加了注释 ORM Entity repositoryClass Maak DefaultBundle Entity Mobil
  • iOS16 Bug 键盘在关闭 SwiftUI 时破坏布局

    在 iOS16 中 工作表内部存在键盘的错误 当工作表关闭时键盘消失 没关系 但布局未更新 我只看到了关于同一问题的 1 个问题 想知道也许有人找到了临时解决方法 直到苹果不解决这个问题 重现代码 struct Test View Stat
  • 如何检查域名是否存在?

    不仅是 com 或 net 等简单的域名 还有 co uk fr gov rw 我真的应该做一个巨大的映射 tld 到相关的 whois 服务器 还是有更简单的方法 http php net manual en function check
  • 尝试查看项目属性时 Visual Studio 2008 中出现“未指定错误”

    当我将活动解决方案从 Win32 设置为 x64 时 我无法构建项目或查看属性 当我尝试构建我的项目时 它被跳过 当我尝试查看属性时 第一次尝试时没有任何反应 第二次 我收到一条错误消息 操作无法完成 未指定的错误 我正在运行 Visual
  • Int16 - .net 中的字节容量?

    为什么 short a 0 Console Write Marshal SizeOf a shows 2 但如果我看到 IL 代码 我会看到 1 IL 0000 ldc i4 0 2 IL 0001 stloc 0 3 IL 0002 ld