BT

C# 7.2における構造体のパフォーマンス

| 作者: Pierre-Luc Maheu フォローする 4 人のフォロワー , 翻訳者 sasai _ フォローする 0 人のフォロワー 投稿日 2018年8月9日. 推定読書時間: 2 分 |

原文(投稿日:2018/07/31)へのリンク

C#コンパイラは、readonlyを伴ういくつかの条件下で、構造体の防衛的コピー(defensive copy)を生成する。この問題はよく知られ、文書化されているが、C# 7.2のいくつかの機能に関係しているため、見直す価値がある。inおよびref readonlyキーワードは問題の発生を高め、readonly構造体はその修正手段を提供する。

C#の構造体は、メモリ割当/解放のコストを避けようと、一般的に高性能を目的として使用される。ところが、それを制限する潜在的な落とし穴がある。C# 7.2では、非常によく発生するケースに対処するため、readonly構造体という改善機能が追加されている。

以下の場合、C#コンパイラは構造体のコピーを生成する。

  •  structシグニチャがreadonlyでない場合
  •  構造体変数にreadonly修飾子が付いている場合
  •  メソッド(プロパティを含む)が呼び出される場合
public struct SomeStruct
{
	private int _x;

	public int X { get { return _x; } }
}

private readonly SomeStruct s = new SomeStruct(42);

s.X; // コンパイラは防衛的コピーを作成する。

xin-パラメータ、ref readonlyローカル変数、readonly参照による値を返すメソッド呼び出しの結果などの場合、同じルールが当てはまる。

public void BadFunction(in SomeStruct s)
{
  s.X; // コンパイラは防衛的コピーを作成する。
}

 

C# 7.2では、構造体をreadonlyだと宣言できる機能が追加することで、防衛的コピーを避けるための解決策を提供している。readonlyだと宣言した構造体は、プロパティセッターを持つことができず、構造体メンバーへの代入が禁止される。

防衛的コピーの問題は、静的解析によって検出できる。ErrorProne.NETは、Java用の静的解析ツールErrorProneからインスピレーションを受けたものだ。その.NETポートはRoslynアナライザの集合体になっており、正確性と性能に重点を置いている。そのサブセットとして、構造体にフォーカスしたものがあり、Nugetパッケージで利用することができる。

Rate this Article

Adoption Stage
Style

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT