c# - 使用指向 Func<> 的指针的分配方法
问题描述
我正在尝试有条件地将 Method 分配给Func<>
. 我试图分配的方法需要一个指针参数,看起来 C# 似乎不允许我与Func<>
. 这是代码。
Func<ulong, ulong, ulong*, ulong> Multiply64Func;
if (Bmi2.X64.IsSupported)
{
Multiply64Func = Bmi2.X64.MultiplyNoFlags;
}
else
{
Multiply64Func = Multiply64;
}
这就是我以后要如何使用它:
hi = Multiply64Func(c[0], b[0], loPtr);
以及相应的错误:error CS0306: The type 'ulong*' may not be used as a type argument
有什么解决方法,或者有没有办法让它工作?
当然,我可以这样做:
hi = Bmi2.X64.IsSupported ? Bmi2.X64.MultiplyNoFlags(c[0], b[0], loPtr) : Multiply64(c[0], b[0], loPtr);
但是,这部分代码对性能非常关键,我发现在热循环中检查它会显着降低速度 - 因此我想执行一次比较,并将相应的方法分配给一个函数。
C# 要做的更多事情是获取一个ref
参数 - 但我无法更改的签名,Bmi2.X64.MultiplyNoFlags;
因为它不是我的代码。
解决方案
但是,这部分代码对性能非常关键,我发现在热循环中检查它会显着降低速度 - 因此我想执行一次比较
将结果缓存在布尔值中并使用您的简单答案。
bool useBmi = Bmi2.X64.IsSupported;
while (expensiveLoop)
{
hi = useBmi ? Bmi2.X64.MultiplyNoFlags(c[0], b[0], loPtr) : Multiply64(c[0], b[0], loPtr);
}
如果您坚持使用委托,您可以这样做:
bool useBmi = Bmi2.X64.IsSupported;
ulong hi; //Must be declared outside the loop
Action multiply = useBmi
? new Action( () => { hi = Bmi2.X64.MultiplyNoFlags(c[0], b[0], loPtr); })
: new Action( () => { hi = Multiply64(c[0], b[0], loPtr); } );
while (expensiveLoop)
{
multiply();
}
推荐阅读
- javascript - Node JS Discord 机器人 | 读写配置文件
- javascript - React:将两个数组(具有相同的变量名)添加到一个数组中
- c++ - 将 decltype 的表达式从常量左值转换为右值是否也会丢弃 `const`?
- mysql - 本地和实时服务器nodejs的不同结果
- laravel - 如何将 Laravel 项目部署到共享服务器
- c# - 如何简化 c#.net 中的 if 条件和 foreach 条件?
- python - Flask.g 数据库连接 - RuntimeError:在应用程序上下文之外工作
- wpf - WPF控件拉伸问题
- docker - 在不同容器端口中设置 hyperledger fabric 2.0 时的问题(测试和开发)
- microsoft-edge - 由于不同的功能和价值,边缘扩展提交失败