将 blittable 结构复制到非托管内存位置的最快方法 (IntPtr)

2024-04-03

我有一个类似于以下的功能:

[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void SetVariable<T>(T newValue) where T : struct {
    // I know by this point that T is blittable (i.e. only unmanaged value types)

    // varPtr is a void*, and is where I want to copy newValue to
    *varPtr = newValue; // This won't work, but is basically what I want to do
}

我看到了 Marshal.StructureToIntPtr(),但它看起来相当慢,而且这是性能敏感的代码。如果我知道类型T我可以直接声明varPtr as a T*,但是……嗯,我不这么认为。

不管怎样,我都在寻找最快的方法来做到这一点。 “安全”不是一个问题:在代码中,我知道结构的大小T将完全适合指向的内存varPtr.


一种答案是使用本机 memcpy 尝试执行的相同优化技巧,在 C# 中重新实现本机 memcpy。您可以在 Microsoft 自己的源代码中看到 Microsoft 这样做。请参阅缓冲区.cs http://referencesource.microsoft.com/mscorlib/system/buffer.cs.html#0d691e54a9fdddc3Microsoft 参考源中的文件:

     // This is tricky to get right AND fast, so lets make it useful for the whole Fx.
     // E.g. System.Runtime.WindowsRuntime!WindowsRuntimeBufferExtensions.MemCopy uses it.
     internal unsafe static void Memcpy(byte* dest, byte* src, int len) {

        // This is portable version of memcpy. It mirrors what the hand optimized assembly versions of memcpy typically do.
        // Ideally, we would just use the cpblk IL instruction here. Unfortunately, cpblk IL instruction is not as efficient as
        // possible yet and so we have this implementation here for now.

        switch (len)
        {
        case 0:
            return;
        case 1:
            *dest = *src;
            return;
        case 2:
            *(short *)dest = *(short *)src;
            return;
        case 3:
            *(short *)dest = *(short *)src;
            *(dest + 2) = *(src + 2);
            return;
        case 4:
            *(int *)dest = *(int *)src;
            return;
        ...

有趣的是,他们本机实现了最大 512 的所有大小的 memcpy;大多数大小都使用指针别名技巧来让虚拟机发出对不同大小进行操作的指令。仅在 512 处,他们才最终调用本机 memcpy:

        // P/Invoke into the native version for large lengths
        if (len >= 512)
        {
            _Memcpy(dest, src, len);
            return;
        }

据推测,本机 memcpy 甚至更快,因为它可以手动优化以使用 SSE/MMX 指令来执行复制。

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

将 blittable 结构复制到非托管内存位置的最快方法 (IntPtr) 的相关文章

  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • C++0x 初始值设定项列表示例

    我想看看这个现有代码示例如何利用 C 0x 初始化列表功能 示例0 include
  • 使用 GCHandle 将大型结构数组从 C# unity 脚本传递到 C++ dll 在 C++ 函数执行后崩溃

    我想从 C unity 脚本将结构数组传递给 c 本机插件 我做了如下操作 我可以访问数据 但我的应用程序在执行 c 函数后崩溃 我不知道为什么 C side StructLayout LayoutKind Sequential publi
  • std::bind2nd 和 std::bind 与二维数组和结构数组

    我知道 C 有 lambda 并且 std bind1st std bind2nd 和 std bind 已弃用 然而 从C 的基础开始 我们可以更好地理解新特性 所以 我从这个非常简单的代码开始 使用int 数组s 第一个例子 与std
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • 静态 OpenCV 库中未定义的引用

    我有一个使用 OpenCV 3 1 的 C 项目 并且使用共享库可以正常工作 但现在我想使用静态库 位于项目目录中的文件夹中 来编译它 因为我希望能够在未安装 OpenCV 的情况下导出它 如果需要还可以编辑和重新编译 这次我重新编译了 O
  • 如何部署包含第三方 DLL 文件的 C# 应用程序?

    首先 我对部署了解不多 我希望我的问题有意义 我需要将 C 应用程序安装 部署到多个桌面 它需要一个第三方 DLL 文件 一个 C 库 lpsolve55 dll 对于那些感兴趣的人 它是一个免费的 MIP LP 求解器 请参阅 lpsol
  • 如何将 Visual-Studio 2010 切换到 c++11

    我是 c 编程新手 我想尝试 c 11 新功能 那么我要问的是如何切换 Visual studio 2010 才能编译 c 11 源代码 你可以参考这个表 VC10 中的 C 0x 核心语言功能 表格 http blogs msdn com
  • 打开位置设置页面或提示用户启用位置

    我一直在绞尽脑汁 徒劳地谷歌搜索 我正在尝试找到一种方法来提示用户通过直接进入设置页面或仅点击屏幕上的 是 来切换位置 我见过的所有代码似乎都不起作用 有人有有效的方法吗 一个详细的例子将不胜感激 谢谢 我对 Xamarin 开发非常陌生
  • 根据 Active Directory 策略检查密码[重复]

    这个问题在这里已经有答案了 我有一个允许用户更改其 AD 密码的前端 有没有办法获取特定用户及其属性 长度 复杂性 的密码策略 例如细粒度 有没有办法根据此特定策略检查字符串 xyz121 编辑 我不想检查活动目录中存储的当前密码 我想检查
  • 主构造函数不再在 VS2015 中编译

    直到今天 我可以使用主构造函数 例如 public class Test string text private string mText text 为了能够做到这一点 在以前的 Visual Studio CTP 中 我必须将其添加到 c
  • C# 反序列化过程中创建指向父对象的指针

    我有这样的课程 Serializable public class child public Parent parent Serializable public class Parent public List
  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • 禁用实体框架的默认值生成(Code First)

    我数据库中有一个列不能为空 我想将其设置为默认值在数据库中 问题是实体框架似乎自己创建了一个默认值 例如 int gt 0 并且完全忽略了数据库中的默认值约束 有没有办法禁用实体框架的默认值 我发现您可以使用以下属性来装饰您的字段 Data
  • 如何在 ASP.NET Core 项目中使用 MStest 测试 Ok() 结果

    我正在使用 MStest 来测试我的控制器 我想测试这个动作 HttpGet Name GetGroups public async Task
  • 包含从代码隐藏 (ASP.NET C#) 到 ASPX 中的图像概述的图像列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • 有没有办法在 C# 中仅通过文件名查找文件?

    我们现在使用绝对路径或相对路径在 C 应用程序中查找文件 如果文件位于当前工作目录下或 路径 之一下 有没有办法仅通过名称查找文件 使用绝对路径不好 使用相对路径也不够好 因为我们可能通过重命名或移动项目文件夹来更改项目结构 如果我们的代码
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con

随机推荐

  • FFMPEG:合并音频(.mp3)和单个图像将它们转换为视频

    我想合并 IMAGE AUDIO 并使用 FFMPEG 库将它们转换为视频 我成功编译了该库 并得到了 libfmpeg so 但是通过 java 代码执行 ffmpeg 命令时出现问题 这是我正在使用的命令 ffmpeg i image8
  • PHP 中多行注释内的多行注释

    PHP 返回 语法错误 这是否是使用多行注释的完全错误的方法 有时我需要注释掉一大块代码进行测试 而这个代码块包含数百行 并且里面有很多多行注释 注释掉这个大块的最佳方法是什么 除了暂时从文件中删除它之外 来自PHP手册 http php
  • XML 与逗号分隔的文本文件

    好吧 我读了几本关于 XML 的书 并编写了程序来吐出它 等等 但问题是这样的 逗号分隔文件和 XML 文件都是 人类可读的 但总的来说 逗号分隔文件比 XML 文件更容易被我看到 标签通常占用与数据一样多的空间 甚至更多 这似乎掩盖了我正
  • argc、argv、envp的内存布局

    据我了解 环境变量的值直接在内存中以 NULL 结尾argv价值观 除了环境变量之外 auxv存在 环境变量到底是如何布局的 这个布局在哪里指定 记录 以及它适用于哪些系统 一个简单的答案是 程序调用时堆栈的布局由二进制格式定义 例如 EL
  • iPhone Xcode 项目文件夹中是否存储了任何“敏感”内容?

    我想开源我的一个 iPhone 应用程序 我已经在 iTunes 商店中发布 但我显然不想暴露任何 敏感 内容 例如配置证书和代码签名密钥等 我猜那东西只是引用的从 Xcode 项目文件夹 实际上存储在磁盘上其他地方的我的钥匙串中 如果我要
  • 当我添加点击事件时,我的 javascript 函数会重复运行(?)

    免责声明 我正在尝试学习javascript 我不是一个聪明人 所以 我做了一个 Jquery 图像滑块 我很自豪 有用 它加载图像 并日复一日地逐个显示它们 生活过得很好 然后我想为滑块添加导航 黑暗降临在我的小王国上 当我单击其中一个按
  • 保存附件时排除图像 png 和 gif 的 VBA 代码

    我正在使用宏来回复附件 但它总是获取嵌入在邮件中的所有图像并将它们作为附件 我试图在将附件下载到临时文件夹时插入一个片段以排除所有 png 和 gif 格式 原始代码 工作 但也下载嵌入图像 Sub ReplyWithAttachments
  • 哈斯克尔“点黑客”

    In the 数独解决方案的 Wiki 页面 http www haskell org haskellwiki Sudoku Chaining style Solver 一种解决方案声称使用 Dot Hack 链接的 Github 页面不再
  • Windows 8 上的 Firefox 远程调试“意外错误”

    我需要在 Firefox 中调试 Android 的 Web 应用程序 我尝试将设备连接到桌面版 Firefox 但总是收到错误 意外错误 我已经执行了所有步骤https developer mozilla org en US docs T
  • 解析没有完整路径的json

    我想解析 json 而不输入它的路径 I have 如何从未转义的 Url 中获取字符串 我怎样才能在没有路径的情况下做到这一点 所以我有那些 和 我该如何使用它 我的代码是 string itemname Hat with no name
  • 如何在 PHP 中用字符串回显警报——单引号和双引号的一些混淆

    我对如何在屏幕上表示输出 echo 语句中的字符串来调试 php 感到完全困惑 首先 这对我来说实际上很完美 echo 这使用双引号作为 echo 语句的一部分 可以这么说 在命令的外部 并在警报语句上使用单引号 它有效 那么如何在警报语句
  • 没有jquery的outerWidth

    可以使用dom获取元素outerWidth吗 Ej var width document getElementById myDiv outerWidth 不 但是您可以获得 offsetWidth 这可能就是您想要的 From http w
  • linux c - 获取服务器主机名?

    有谁知道有一个函数可以获取linux服务器的主机名吗 我真的不想包含任何标头或编译其他库 希望有一个默认内置的函数 我是 c 新手 like 获取主机名 http linux die net man 2 gethostname 这是运行您的
  • 一个恶意链接仍然反映在网站上

    我的网站是一个静态html网站 没有cms 没有wordpress https www reternetics com https www reternetics com 我运行谷歌广告已经有一段时间了 但现在他们拒绝了我的广告 他们说 该
  • 如何使用 Swift 获取 iOS APP 存档日期 [重复]

    这个问题在这里已经有答案了 我的应用程序有一个要求 我需要使用 swift 显示 ipa 文件创建日期 谁能告诉我该怎么做 提前致谢 您可以使用 Bundle 属性获取应用程序的 url可执行文件URL https developer ap
  • 在mvc c#环境中将doc转换为pdf

    您好 我有一个在特定用户 app pool 用户 下运行的 C MVC 应用程序 我需要将 doc 或 docx 文件转换为 pdf 我认为一个不错的选择是使用 libreoffice 来启动一个启动此进程的进程 为了让自己的生活更轻松 如
  • mat-select 和 mat-chip 可以一起使用吗?

    我想知道是否可以 混合 mat select and mat chip list 在里面chip list 我想显示从中选择的选项mat select 如果是的话我该怎么办 对的 这是可能的 你需要使用
  • 使用 php 将数组分成块并按块在新行中显示结果

    所以正如标题所说 我有一个数组 array 0 gt a 1 gt b 2 gt c 3 gt d 4 gt e 5 gt f 我想做的是循环遍历并分块结果并像这样打印它们 ab cd ef OR abc def 到目前为止我得到了这个 我
  • 如何动态启用禁用的复选框?

    请看这里 http jsfiddle net nShQs http jsfiddle net nShQs 按禁用按钮 然后按启用按钮 该复选框未启用 HTML
  • 将 blittable 结构复制到非托管内存位置的最快方法 (IntPtr)

    我有一个类似于以下的功能 MethodImpl MethodImplOptions AggressiveInlining public void SetVariable