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

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(使用前将#替换为@)

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

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 无法使用已与其底层 RCW 分离的 COM 对象。在 oledb 中

    我收到此错误 但我不知道我做错了什么 下面的代码在backrgroundworker中 将异常详细信息复制到剪贴板 System Runtime InteropServices InvalidComObjectException 未处理 通
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 如何避免情绪低落?

    我有一个实现状态模式每个状态处理从事件队列获取的事件 根据State因此类有一个纯虚方法void handleEvent const Event 事件继承基础Event类 但每个事件都包含其可以是不同类型的数据 例如 int string
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • Web API - 访问 DbContext 类中的 HttpContext

    在我的 C Web API 应用程序中 我添加了CreatedDate and CreatedBy所有表中的列 现在 每当在任何表中添加新记录时 我想填充这些列 为此目的我已经覆盖SaveChanges and SaveChangesAsy
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 如何返回 json 结果并将 unicode 字符转义为 \u1234

    我正在实现一个返回 json 结果的方法 例如 public JsonResult MethodName Guid key var result ApiHelper GetData key Data is stored in db as v
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • x86 上未对齐的指针

    有人可以提供一个示例 将指针从一种类型转换为另一种类型由于未对齐而失败吗 在评论中这个答案 https stackoverflow com questions 544928 reading integer size bytes from a
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • ASP.NET MVC 6 (ASP.NET 5) 中的 Application_PreSendRequestHeaders 和 Application_BeginRequest

    如何在 ASP NET 5 MVC6 中使用这些方法 在 MVC5 中 我在 Global asax 中使用了它 现在呢 也许是入门班 protected void Application PreSendRequestHeaders obj
  • 恢复上传文件控制

    我确实阅读了以下帖子 C 暂停 恢复上传 https stackoverflow com questions 1048330 pause resume upload in c 使用 HTTP 恢复上传 https stackoverflow

随机推荐

  • 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 编译器要求固定大小缓冲区只能是基本类型 为什么固定大小的缓冲区不能由如下结