固定大小缓冲区不能直接从“this”对象使用

2024-01-11

我使用结构来表示纯数据。其中一个字段是固定大小的缓冲区,如下所示。

[StructLayout(LayoutKind.Sequential, Pack=2)]
unsafe struct ImageDosHeader
{
    ...
    private fixed ushort _e_res[4];
    ...

    [Description("Reserved")]
    [DisplayName("e_res[0]")]
    public ushort e_res_0 { get { ... } set { ... } }

    ...
}

在 get/set 函数中,我尝试执行以下操作,但收到“编译器错误 CS1666:您不能使用未固定表达式中包含的固定大小缓冲区。尝试使用固定语句。”

return this._e_res[0];

然而,以下工作:

fixed (ImageDosHeader* p = &this)
    return p->_e_res[0];

ImageDosHeader local = this;
return local._e_res[0];

我可以轻松使用这些解决方法,但是,我想知道为什么直接访问固定大小的缓冲区是非法的。或者这是我应该报告的错误?

我正在使用.NET 2.0。


这是因为底层的 IL 指令。

该程序执行以下指令序列来获取您想要的元素:

  1. 将地址加载到堆栈上。

  2. 将偏移量加载到堆栈上。

  3. 添加它们。

  4. 读取该内存地址处的值。

如果该对象位于堆中,然后在步骤 4 之前由于垃圾回收而移动,则从步骤 1 加载的地址将不再有效。为了防止这种情况,您需要首先将对象固定到内存中。

(事实上​​,您正在通过this指针意味着您不知道该结构是在堆上还是在堆栈上,因此您必须固定它以防万一它在堆上。)

第二个例子之所以有效,是因为它copies的结构stack,因此副本永远不会移动,因此地址将始终有效。

为什么其他类型的字段不会出现同样的问题?因为它们的偏移已知为编译时,而数组索引已知为run-time,因此 JIT 可以生成始终正确访问字段的代码。

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

固定大小缓冲区不能直接从“this”对象使用 的相关文章

随机推荐

  • 不带任何特殊字符的 10 位数字的正则表达式

    10 位数字的正则表达式是什么 无特殊字符且无小数 使用此正则表达式仅匹配十位数字 d 10 要查找字符串中任意位置的十个连续数字的序列 请使用 d 10 请注意 这还将查找 11 位数字的前 10 位数字 在字符串中的任意位置搜索exac
  • 当您没有对容器的引用时,是否可以让温莎城堡解决属性依赖关系?

    我们有一个包含多个项目的解决方案 代表我们应用程序的各个层 例如 Domain Data Logic WebUI 我们的温莎城堡容器是从我们的 Web 层引用的 然后我们通过我们的层将这些依赖项级联起来 例如 In Domain publi
  • jquery 插件语法包装器

    这到底是做什么的 我知道它被 jquery 插件包围 但并没有真正理解它的作用 function undefined Plugin goes here jQuery 是一种在 javascript 中运行一段代码的方法 第一对括号是代码部分
  • php 在实例中设置匿名函数

    我刚刚开始使用 PHP 我想知道是否有一种方法可以将匿名函数添加到类实例中 例如 可以说 class A public B c new A This is where I am getting a little confused The f
  • PySpark:从数据帧创建字典的字典?

    我有以下格式的数据 这些数据是从 Hive 获取到数据帧中的 date stock price 1388534400 GOOG 50 1388534400 FB 60 1388534400 MSFT 55 1388620800 GOOG 5
  • 如何在Windows中使用批处理文件删除包含特定字符串的文件?

    我的松下相机使用其愚蠢的 PHOTOfunSTUDIO 来导入照片 它按照片拍摄日期的名称创建文件夹 并将照片分别导入到这些文件夹中 到目前为止 一切都很好 但是 如果我在从相机中删除所有旧照片之前再次导入 则无论我如何更改该软件的设置 旧
  • 将 Docker 容器与 Mesos/Marathon 链接

    到目前为止 我使用 Mesos Marathon 和 Docker 来管理服务器群以及放置在服务器上的容器 取得了巨大成功 然而 我现在想更进一步 开始做一些事情 比如自动将 haproxy 容器链接到每个启动的主 docker 服务 或者
  • SQL Server 2012 CTE 查找分层数据的根或顶层父级

    我在尝试递归地遍历层次结构以查找组织结构中可能具有的所有后代节点的顶部节点时遇到问题multiple顶级节点 我正在尝试使用 SQL Server 2012 CTE 来执行此操作 但它不会递归到达每个分支的最顶层节点 我已经尝试完全按照与此
  • 我的 Web api 2 控制器需要路由

    我有一个返回 XML 的简单 WebApi2 控制器 但我无法使用我定义的路由正确添加另一个方法 namespace CBMI WebAPIservice Controllers public class MarkersController
  • 使用 QWebEngine 渲染图像

    我正在寻找替换QWebKit with QWebEngine在我的无头渲染器中 我初始化页面load 并将一个插槽连接到loadFinished 生成最终的 PNG 图像 这曾经工作得很好WebKit但失败了QWebEngine 代码如下
  • 在 Jekyll 上的 CSS 中使用 Liquid 诱惑来调整每页的 div 背景颜色

    我正在使用 Jekyll 和 Liquidwebsite http annawees github io 我一直坚持在 CSS 中使用 Liquid 来正确编译 我尝试为每个页面的边框使用不同的颜色 并将默认设置为黑色 我很欣赏你们的任何见
  • RealmList序列化问题(Realm/Gson/Intent)

    我在项目中使用了 Retrofit Gson 和 Realm 我有这门课Example需要是Serializable 如果没有 Realm 我会这样写 public class Example implements Serializable
  • HttpWebRequest 底层连接已关闭

    我在用HttpWebRequest to POST通过网络服务的字节数组图片 图片大小类似于byte 4096 Code HttpWebRequest webRequest HttpWebRequest WebRequest Create
  • 从 JNI 调用函数指针

    我已经在 cpp 中用原型实现了一个函数 MyFunction int size int 回调 UINT16 arg1 UINT16 arg2 第二个参数是一个函数指针 必须在java中实现 我怎样才能实现该功能 另外我如何在 JNI 中调
  • 关于使用 Async 和 Await C# 进行异步编程的问题[重复]

    这个问题在这里已经有答案了 我正在学习如何使用 Async 和 Await C 所以我得到了一个链接http msdn microsoft com en us library vstudio hh191443 aspx BKMK WhatH
  • 将 Rcpp 函数扩展到任何类型的输入向量

    我有以下函数 它执行一个简单的循环NumericVector并返回int类型值 Rcpp cppFunction int calc streak NumericVector x int i1 int i2 int cur streak 1
  • 在 matplotlib 中向 3d 箭袋图添加颜色

    我想要在 3d 箭袋图中具有与颜色图相对应的颜色 绘图的 2d 版本有一个可选数组 用于将颜色映射到箭头 如何在 3d 版本中创建相同的效果 3D 箭袋图是 1 4 中的一个全新功能 它 及其文档 可能仍然有点粗糙 在这种情况下 我们可以尝
  • 将字符串列表转换为排序的映射字符串长度作为键

    我有一个List
  • 动画汉堡导航

    我正在为我的网站创建一个完整的页面导航阴影 以便它在所有设备上都相同 目前我有两个按钮 一个用于当阴影在视野中时 一个用于当阴影不在视野中时 我想知道是否让一个按钮始终存在以便可以动画化会更好 我的目标是像squeeze动画片here ht
  • 固定大小缓冲区不能直接从“this”对象使用

    我使用结构来表示纯数据 其中一个字段是固定大小的缓冲区 如下所示 StructLayout LayoutKind Sequential Pack 2 unsafe struct ImageDosHeader private fixed us