为什么固定大小的缓冲区只能是原始类型?

2024-04-10

我们必须与本机代码进行大量互操作,在这种情况下,使用不需要封送处理的不安全结构要快得多。但是,当结构包含非基本类型的固定大小缓冲区时,我们无法执行此操作。 为什么 C# 编译器要求固定大小缓冲区只能是基本类型?为什么固定大小的缓冲区不能由如下结构组成:

[StructLayout(LayoutKind.Sequential)]
struct SomeType
{
  int Number1;
  int Number2;
}

C# 中的固定大小缓冲区是通过称为“不透明类”的 CLI 功能实现的。第 I.12.1.6.3 节Ecma-335 http://www.ecma-international.org/publications/standards/Ecma-335.htm描述他们:

一些语言提供多字节数据结构,其内容由直接操作 地址算术和间接运​​算。为了支持此功能,CLI 允许值类型 以指定的大小创建,但没有有关其数据成员的信息。实例 这些“不透明类”的处理方式与任何其他类的实例完全相同,但是 ldfld、stfld、ldflda、ldsfld 和 stsfld 指令不得用于访问其内容。

“没有关于其数据成员的信息”和“不得使用 ldfld/stfld”是问题所在。第二条规则禁止结构,您需要 ldfld 和 stfld 来访问它们的成员。 C# 编译器无法提供替代方案,结构的布局是运行时实现细节。 Decimal 和 Nullable 已被淘汰,因为它们也是结构体。 IntPtr 已被淘汰,因为它的大小取决于进程的位数,这使得 C# 编译器很难生成用于访问缓冲区的 ldind/stind 操作码的地址。引用类型引用已被淘汰,因为 GC 需要能够找到它们,但根据第一条规则却做不到。枚举类型的大小可变,具体取决于其基类型;听起来像是一个可以解决的问题,但不完全确定他们为什么跳过它。

只剩下 C# 语言规范中提到的那些:sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double 或 bool。只是具有明确尺寸的简单类型。

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

为什么固定大小的缓冲区只能是原始类型? 的相关文章

  • 运行应用程序时.NET 3.5 JIT 不工作

    以下代码在 Visual Studio 内部运行该版本和在 Visual Studio 外部运行该版本时提供不同的输出 我正在使用 Visual Studio 2008 并面向 NET 3 5 我也尝试过 NET 3 5 SP1 在 Vis
  • Task.Factory.StartNew 或 Parallel.ForEach 对于许多长时间运行的任务? [复制]

    这个问题在这里已经有答案了 可能的重复 Parallel ForEach 与 Task Factory StartNew https stackoverflow com questions 5009181 parallel foreach
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • C# - Visual Studio 中的 System.OutOfMemoryException

    我遇到问题 当我右键单击 Visual Studio 中的主窗体并转到 视图设计器 时 出现错误 它说 引发了 System OutOfMemoryException 类型的异常 堆栈跟踪 at System Reflection Asse
  • JetBrains Rider 针对 4.5 框架,无法切换到 4.7

    基本上 当尝试添加不支持旧框架的 NuGet 包时 会出现错误 但是在项目配置中只有 4 5 可用 在项目创建过程中 不存在选择目标的选项 有什么方法可以正确配置它吗 I haven t found out how to set up NE
  • 使用 GCHandle 将大型结构数组从 C# unity 脚本传递到 C++ dll 在 C++ 函数执行后崩溃

    我想从 C unity 脚本将结构数组传递给 c 本机插件 我做了如下操作 我可以访问数据 但我的应用程序在执行 c 函数后崩溃 我不知道为什么 C side StructLayout LayoutKind Sequential publi
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 多线程 - 比单线程慢

    当我使用多个线程而不是单线程运行程序时 它会变慢 不是应该更快吗 该程序应该遍历从起始目录开始的所有目录 并查找并打印所有名为 X 的文件 代码如下 while done pthread mutex lock lock if list is
  • 多个线程访问一个变量

    我在正在读的一本教科书中发现了这个问题 下面也给出了解决方案 我无法理解最小值怎么可能是 2 为什么一个线程不能读取 0 而所有其他线程都执行并写入 1 而无论是1还是2 最后写入的线程仍然必须完成自己的循环 int n 0 int mai
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • 使用联合对 IP 地址进行多种解释?

    在工作中 我们使用以下构造来将 IP 地址解释为 4 字节数组或 32 位整数 union IPv4 std uint32 t ip std uint8 t data 4 这很好用 但是读完这本书的第 97 章 不要使用联合来重新解释表示
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • 在 lua 中加载 C++ 模块时出现“尝试索引字符串值”错误

    我正在尝试使用 lua 用 C 编写的函数 下面给出的是cpp文件 extern C include lua h include lauxlib h include lualib h static int add 5 lua State L
  • 如何使用“路径”查询 XDocument?

    我想查询一个XDocument给定路径的对象 例如 path to element I want 但我不知道如何继续 您可以使用以下方法System Xml XPath Extensions http msdn microsoft com
  • C# 模式匹配

    我对 C 有点陌生 我正在寻找一个字符串匹配模式来执行以下操作 我有一个像这样的字符串 该书将在 唐宁街 11 号接待处 并将由主要医疗保健人员参加 我需要创建一个 span 标签来使用 startIndex 和 length 突出显示一些
  • 包含从代码隐藏 (ASP.NET C#) 到 ASPX 中的图像概述的图像列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C# 和断点 - 这里有魔术师吗?

    我有这个 public static void ByLinkText string text for var i 0 i lt 50 i try Setup Driver FindElement By LinkText text Click
  • 是否可以检测流是否已被客户端关闭?

    简要介绍一下情况 我有一项服务可以通过套接字接收信息并发送回复 连接不安全 我想设置另一个可以为这些连接提供 TLS 的服务 这个新服务将提供单个端口并根据提供的客户端证书分发连接 我不想使用 stunnel 有几个原因 其中之一是每个接收
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include

随机推荐

  • socket.io redis 和内存泄漏

    我的socket io版本是 电子邮件受保护 cdn cgi l email protection and 电子邮件受保护 cdn cgi l email protection 我在 Windows 上 在某些地方 我看到问题已得到解决 我
  • 为我的网络应用程序生成虚拟数据 - 寻找字典[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 抱歉 如果这不是主题 但它is当然是编程related 我需要大规模测试我的 Web 应用程序 并发用户
  • CouchDB“加入”两个文档

    我有两个看起来有点像这样的文档 Doc id AAA creator id data DataKey id credits left 500 times used 0 data id AAA 我想要做的是创建一个视图 它允许我传递 Data
  • 如果达到标识列的最大值,将附加什么? [复制]

    这个问题在这里已经有答案了 可能的重复 主键 Id 会发生什么情况 当它超过限制时 https stackoverflow com questions 5305232 what happens to the primary key id w
  • “find”(命令)找不到 -wholename 的任何内容

    为什么这个命令有效 home user1 tmp find wholename tmp file c exec echo user2 tmp file c home user1 tmp 而且这个命令不起作用 什么也没发现 home user
  • 使用 StaticResource 作为 VisualTransition 的 Storyboard 时出错

    我在 Button 控件的 VisualStateGroup 内有一个 VisualTransition Storyboard 属性绑定到 StaticResource Storyboard
  • 如何将cropit中的图片导出到php进行上传?

    我已经在互联网上搜索了一段时间 但找不到任何可以告诉我如何将结果从 image cropper cropit export 转换为 PHP 可以上传到服务器的图像 我正在使用 Cropit 插件 我需要的只是一个可以传递到我的 php 上传
  • 如何在文本中间的

    内使用

    标记

    ? [复制]

    这个问题在这里已经有答案了 我想做这样的事情 p This is a p h2 text h2 paragraph 我禁用了 h2 的边距和填充 但它仍然打破了 h2 标签前后的线条 如何在文本中间使用 h2 标签并使其看起来像普通单词 就
  • Xcode 8 Swift 3 音高改变声音

    我正在尝试制作一个带有击中声音的简单游戏 每当您击中某物时 击中声音都会有不同的音调 我以为这很简单 但最终却带来了很多东西 其中大部分是我完全从别人那里复制的 func hitSound value Float let audioPlay
  • C 编程:预处理器、宏作为标记

    我正在尝试做一些概念上与此类似的事情 但似乎无法让它发挥作用 最后显示错误 任何想法 include
  • z/OS 如何调用 Web 服务? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个 COBOL 程序 需要从 Web 服务获取数据 如果不使用 CICS 我最好的选择是什么 我认为 C 程序可以读取 Web
  • Python-2.x 中的 super() 是否损坏? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在页面视图之间导航时如何取消所有正在运行的传奇

    当用户决定导航到应用程序内的另一个 页面 时 我正在尝试找到一种简单易用的方法来取消 页面 内所有正在运行的传奇 我们不使用路由 而是使用每个 页面 是一个更大的主机应用程序中自己的小部件 负责在用户导航时创建和加载每个页面 目前 我们正在
  • 在 .NET 5.0 上向 Windows 窗体添加配置

    我正在将现有的 Windows 窗体 C 应用程序迁移到 NET 5 0 并且我正在尝试遵循迁移文档 https learn microsoft com en us dotnet desktop winforms migration vie
  • CMake:执行宏/函数作为add_custom_command的命令

    我正在使用一个外部库 它提供了用于自动代码生成的 CMake 函数 以在我的 CMakeLists 中使用 问题是 每当我修改 CMakeLists 时 该函数都会再次运行 从而触发新生成但未更改的源的重新编译 我需要像 add custo
  • 如何让 forEach 循环等待每个 Ajax 函数完成

    我有一个array语句 我想循环遍历每个语句并提交给server via an ajax称呼 我必须确保每一个ajax请求在发送下一个请求之前执行 因为server边代码 我正在创建一个unique key为了这array的声明 发生的情况
  • 使用 PDO 设置连接超时

    我正在使用 PDO 从 MySQL 服务器获取数据 我注意到的是 如果 MySQL 服务器不可用 则需要really 相对 很长时间这段代码返回异常 try handle new PDO db type host db host dbnam
  • 如何将 CMD shell 变量展开两次(递归)

    使用 Windows XP CMD 命令行 我可以将变量展开两次 如下所示 set AAA BBB set BBB CCC for F usebackq tokens i in echo AAA do echo i 会回声CCC I e A
  • 调用未定义函数 pcntl_fork() php-fpm nginx

    我正在尝试使用pcntl fork 在 php fpm 中 但它不可用 我得到 Call to undefined function pcntl fork 尽管我已经评论过了disable functions in the php ini
  • 为什么固定大小的缓冲区只能是原始类型?

    我们必须与本机代码进行大量互操作 在这种情况下 使用不需要封送处理的不安全结构要快得多 但是 当结构包含非基本类型的固定大小缓冲区时 我们无法执行此操作 为什么 C 编译器要求固定大小缓冲区只能是基本类型 为什么固定大小的缓冲区不能由如下结