rksoftware

Visual Studio とか C# とかが好きです

C# 9.0 の確認「localsinit フラグの出力を抑制する」

C# 9.0 の確認の目次はこちら

■ localsinit フラグの出力を抑制する

ドキュメントはこちら

パフォーマンスと相互運用 という項目の 4 つめの塊の 「最後に、」 から始まるブロックです。
この属性がついている場合、ゼロ初期化がなされずパフォーマンスが向上する場合があるそうです。

■ コード

unsafe が許可されている場合のみ使えます(unsafe の中に書く必要はありません)。
例えばこんなコードです。

[System.Runtime.CompilerServices.SkipLocalsInit]
unsafe static void Main(string[] args)
{
    int i;
    int* j = &i;
    Console.WriteLine(*j);
}

この属性は モジュール, クラス, 構造体, コンストラクター, メソッド, プロパティ、インデクサー, イベント, インターフェイス でのみ有効だそうです。例えばフィールドにつけようとすると次のエラーになります。

エラー    CS0592  属性 'System.Runtime.CompilerServices.SkipLocalsInit' はこの宣言型では無効です。'モジュール, クラス, 構造体, コンストラクター, メソッド, プロパティ、インデクサー, イベント, インターフェイス' 宣言でのみ有効です。

■ まとめ

ドキュメントに特に stackalloc 使用する場合、パフォーマンスが大きく向上するとあります。stackalloc を使う場合、それはパフォーマンスが求められる場合であることが多いでしょう。必要が出たときにこの機能を思い出せるように備えましょう。