【发布时间】:2019-04-15 19:35:02
【问题描述】:
有什么方法可以在 C# 中模拟 C++ 值模板参数?
template<bool flag>
void Method()
{
// Do some work
if constexpr(flag)
{
// Do something specific
}
// Do some more work
}
这样它会生成两个版本的方法,可以这样调用:
Method<false>();
Method<true>();
这是出于性能原因,因此最好不要在Method 内进行额外调用。 Method 是性能关键部分,它被调用了数十亿次,因此从它挤出每个 CPU 周期非常重要。
另一方面,它有一个相当复杂的逻辑,所以我宁愿不要有两个副本。
我想我可以用泛型做一些事情,但这不是性能的最佳选择。所以现在我能想到的唯一方法就是为它创建某种模板代码生成器。但也许还有其他选择? 或许可以使用 Roslyn 编译该方法的两个版本,以便创建带有特定参数的两个优化版本?
void Method(bool flag)
{
// Do some work
if (flag)
{
// Do something specific
}
// Do some more work
}
这样我就可以编译成:
void Method_false(false)
{
// Do some work
// Do some more work
}
到:
void Method_true(true)
{
// Do some work
// Do something specific
// Do some more work
}
有可能吗?
【问题讨论】:
-
我怀疑这是可能的,即使是这样,您也必须指出您想在某个时候调用这两种方法中的哪一种。在某些时候,您必须以某种方式执行切换。但是,如果客户端代码只被调用一次,那不是什么大问题。
标签: c# c++ performance