首页 > 解决方案 > 使用指向 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;因为它不是我的代码。

标签: c#

解决方案


但是,这部分代码对性能非常关键,我发现在热循环中检查它会显着降低速度 - 因此我想执行一次比较

将结果缓存在布尔值中并使用您的简单答案。

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();
}

推荐阅读