gpt4 book ai didi

c# - 有没有办法获得指向泛型类型的 "in"参数的指针?

转载 作者:行者123 更新时间:2023-11-30 17:30:14 25 4
gpt4 key购买 nike

我有一些性能关键的硬件互操作代码,出于优化原因(是的,我分析过)将通用结构参数作为 ref(即使它实际上并没有修改参数),然后使用 System.Runtime.CompilerServices.Unsafe类将其转换为可以传递给硬件驱动程序的指针。这是一个例子:

unsafe void DoPerformanceCriticalThing<T>(ref T myThing)
where T : struct
{
void* ptr = Unsafe.AsPointer(ref myThing);
// Give ptr to low-level hardware driver.
}

因为这段代码(包括传递给 ptr 的硬件驱动程序)实际上从未修改过 myThing,所以 ref 的存在具有误导性和我想将其更改为 in 参数(C# 7.2 中添加的功能)。但是,in 参数不能作为 ref 参数向前传递,并且 Unsafe 类(还?)不支持 参数中。

所以我的问题是,有没有办法将 ref T myThing 更改为 in T myThing 并且仍然能够获得指向它的指针?

最佳答案

好吧,我终于想出了如何使用新的 'unmanaged' generic constraint 来做到这一点在 C# 7.3 中。将这个新约束应用于泛型类型后,就可以声明该泛型类型的指针并使用 fixed 语句获取参数的地址:

unsafe void DoPerformanceCriticalThing<T>(in T myThing)
where T : unmanaged
{
fixed(T* ptr = &primitive)
{
// Give ptr to low-level hardware driver.
}
}

显然,unmanaged 约束比 struct 约束更具限制性,因为它阻止类型包含对托管对象的任何引用,但我怀疑在大多数情况下 (包括我自己的所有案例)这在实践中不会成为问题。

关于c# - 有没有办法获得指向泛型类型的 "in"参数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50283212/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com