对于无法将 Span 传递到 lambda 表达式的有效替代方案是什么?

2023-11-25

我有一个这种形状的函数,可以进行一维求根:

public delegate double Fun(double x, object o);

public static void Solve(Fun f, out double y, object o) 
{
    y = f(1.0, o);  // all the irrelevant details of the algorithm omitted
}

这是一个固定的形状,以便使算法可重用。将此视为我无法更改的固定库函数(或者至少需要保持通用性和可重用性,并且不会针对此问题的具体情况进行更改)。

我想传递一个需要外部参数的函数Span<T>保留在堆栈上以避免分配,但显然不能推送Span<T>s 进入对象,因为这需要装箱和拆箱。

使用 lambda 表达式,调用代码可能类似于:

void CallingMethod()
{
   Span<double> k1  = stackalloc double[n];
   double answer;
   Solve((x, o) => Wrapper(x, k1, o), out answer, null);
}

double Wrapper(double x, ReadOnlySpan<double> k1, object o)
{
   return <some function of x and k1>;
}

但这不起作用,因为你无法形成闭包Span<T>s 带有 lambda 表达式。它们也不能在泛型类型中使用,任何装箱和拆箱都已取消,不能作为 params 关键字传递,不能用于实例变量等。

有什么办法可以解决这个问题吗?

只是为了强调这个例子过于简单了。我可能有一个 Span,但我目前正在解决的问题需要传递 4 个 Span。我需要为任意数量的人进行设计。


Span 不能在捕获的变量中使用。指针can, 然而。这可能会消除跨度最好的功能,但是在一般情况下,您可以固定跨度并捕获那个固定指针,但你需要真的真的很小心确保委托调用不能转义fixed阻止,即您不会将委托分发到任何地方。一旦你有了固定指针,你就可以recreate内部跨度:

Span<double> k1 = // ...
// ...
fixed (double* ptr = k1)
{
    var evil = ptr; // this is me convincing the compiler that
                    // I've considered whether the delegate could
                    // outlive the delegate invocation
    Solve((x, o) => Wrapper(x, new Span<double>(evil, k1.Length), o), out answer, null);
}

In your specific但是,在这种情况下,如果您只是要固定它(当它已经有效地固定在堆栈上时),您可能根本不关心原始跨度。 “不要让委托超过堆栈框架”的要求仍然存在,但编译器对此稍微不那么大声,因为你already违反所有规则:

double* k1 = stackalloc double[n];
// ...
Solve((x, o) => Wrapper(x, new Span<double>(k1, n), o), out answer, null);

这两个都需要unsafe显然,修饰符。

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

对于无法将 Span 传递到 lambda 表达式的有效替代方案是什么? 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi

随机推荐

  • 小部件中的 jQuery

    我想在 JS 库上使用 jQuery 该库可以添加到随机网站 这些网站可能已经使用也可能尚未使用 jQuery 我实际上有3个问题 我可能会从我自己的 js 脚本 而不是从文档头中的脚本标记 动态加载 jQuery jquery会这样工作吗
  • 为什么 main() 在 C 中不能声明为静态?

    为什么必须将 main 声明为具有外部链接 为什么它不应该是静态的 外部链接是什么意思 因为您将启动文件链接到您的程序 其中 通常 包含调用 main c 文件的汇编代码 如果 main 是静态的 则该代码将无法调用 main extern
  • 通过 php 更新 Facebook 状态

    我想开发一个机器人 它将使用 php 更新 Facebook 帐户的状态 请在这方面指导我 Porchop 是正确的 您可能需要 Facebook Connect API 要更新 Facebook 上的用户状态 您应该查看状态集API 调用
  • 与 Cisco 路由器的持久 ssh 会话

    我在此站点和多个其他位置进行了搜索 但无法解决在一个命令后连接和维护 ssh 会话的问题 下面是我当前的代码 opt local bin python import os import pexpect import paramiko imp
  • 如何从相同的输入类型上传文件夹和文件?

    我使用的表单可以同时上传文件或完整文件夹 我正在使用以下代码
  • 标准 C++11 中的 IEEE 754 总阶

    根据IEEE 浮点维基页面 在 IEEE 754 上 有一个总订单在双精度浮点上 即C 11具有 IEEE 754 浮点数的实现 例如 Linux x86 64 上的 gcc 4 8 当然 operator lt on double通常提供
  • 如何从 svn diff 中排除某些文件?

    我在用着svn diff c 789显示我们软件版本 789 中所做的更改 但它显示了很多我不关心的文件 特别是测试文件 如何从差异中排除某些文件 例如与模式匹配的所有文件 Test java 我在 Windows 上使用 Cygwin 如
  • 微信Api无法设置应用图标

    在注册 iOS 应用程序时 我一直在努力将水印和高分辨率的图标图像上传到微信 api 结果如下 检查这里的网站 http developers wechat com 我尝试了不同的方法来上传28 28 png透明或不透明和灰度 这真的很烦人
  • 学校考勤系统数据库设计

    我正在为一所学校开展一个项目 其中一个特定模块涉及考勤系统 我正在使用 LAMP PHP 5 2 MYSQL 5 堆栈进行开发 现在学校人数约为1500人 每年总工作日约为250天 另外 我必须保留记录5年才能删除 表结构是 student
  • 在 ggplot2 中的轴刻度上显示两个测量单位

    如何在 ggplot2 中的轴刻度上显示两个替代单位 如果有的话 我想要实现的是这样的 这是一种巧妙的方法 d data frame x 1 20 y rnorm 20 5 5 ggplot data d aes x x y y scale
  • 将我的应用程序提交到 TestFlight 后出现问题

    我们发现您最近交付的 AppName 存在一个或多个问题 要处理您的交货 必须纠正以下问题 无效捆绑包 您的应用程序引用的一个或多个动态库不存在于 dylib 搜索路径中 纠正这些问题后 您可以重新交付纠正后的二进制文件 Regards 应
  • 如何将 stderr 和 stdout 重定向到脚本中同一行中的不同文件?

    我知道的就这么多 command 2 gt gt error command 1 gt gt output 有什么方法可以将 stderr 输出到错误文件并将 stdout 输出到 bash 同一行的输出文件吗 只需将它们添加到一行中即可c
  • 阿拉伯语:“源”Unicode 到最终显示 Unicode

    简单的问题 这是我正在寻找的最终显示字符串 现在下面是每个单独的字符 然后被 粘合 在一起 所以我在每个字符之间留了一个空格以阻止连接 请注意它们不是相同的字符 有一些神奇的转换可以将它们融合在一起并将它们转换为新的 Unicode 字符
  • Python 中 statsmodels 中的 ADF 测试

    我正在尝试运行增强迪基富勒测试statsmodels在Python中 但我似乎遗漏了一些东西 这是我正在尝试的代码 import numpy as np import statsmodels tsa stattools as ts x np
  • `gsutil cp` 命令抛出“OSError:文件名、目录名或卷标语法不正确”

    我已经按照gsutil 安装指南按照 Google Cloud 说明进行操作 我已经更新了 GCloud 组件到最新版本 我最近刚刚安装并配置了 GCloud 以使用我的凭据和项目 首先 我使用以下命令从我的数据库中导出我需要的单个集合火库
  • Spark 作业在显示所有作业已完成后重新启动,然后失败(TimeoutException:Futures 在 [300 秒] 后超时)

    I m running a spark job It shows that all of the jobs were completed 然而几分钟后 整个作业重新启动 这次它将显示所有作业和任务也已完成 但几分钟后它将失败 我在日志中发现
  • 使用 UIViewControllerContextTransitioning “从视图控制器”消失

    我遇到了一个问题 我在下面进行了描述 我在用UIViewControllerContextTransitioning用于自定义过渡 我有 2 个视图控制器 第一个视图控制器和第二个视图控制器 现在我想在第一个视图控制器上添加第二个视图控制器
  • 在 Spring Boot 中自动装配参数化构造函数

    我无法在参数化构造函数中传递值时自动装配 bean 如何使用Spring Boot调用参数化构造函数 Component public class MainClass public void someTask AnotherClass ob
  • pySerial - 有没有办法同时选择多个端口?

    我正在开发需要与许多串行端口通信的应用程序 我还没有找到一种方法来做到这一点而不使用每个端口的线程 有没有办法用单线程来做到这一点 比如同时在多个端口上选择或轮询 我正在使用 pyserial 2 6 我假设您在类 Unix 平台上使用 P
  • 对于无法将 Span 传递到 lambda 表达式的有效替代方案是什么?

    我有一个这种形状的函数 可以进行一维求根 public delegate double Fun double x object o public static void Solve Fun f out double y object o y