定数 intrinsic
IsConstantExpression intrinsic を使用すると、特定の式がコンパイル時に定数になっているかチェックできます。
using static Unity.Burst.CompilerServices.Constant;
var somethingWhichWillBeConstantFolded = math.pow(42.0f, 42.0f);
if (IsConstantExpression(somethingWhichWillBeConstantFolded))
{
// Burst は somethingWhichWillBeConstantFolded がコンパイル時に定数であることを認識します
}
これは複雑な式の定数畳み込みが常に行われるかチェックするのに便利であり、既知の定数値の最適化に使用できます。例えば、整数乗のための pow のような関数を実装したい場合は、以下のようになります。
using static Unity.Burst.CompilerServices.Constant;
public static float MyAwesomePow(float f, int i)
{
if (IsConstantExpression(i) && (2 == i))
{
return f * f;
}
else
{
return math.pow(f, (float)i);
}
}
IsConstantExpression チェックでは、i が定数でない場合は if 条件が false になるため、Burst が常に分岐を除外します。i が定数で 2 に等しい場合は、より最適なシンプルな乗算を代わりに使用できます。
Note
定数畳み込みは最適化中にのみ行われます。最適化を無効にしている場合、intrinsic は false を返します。