質問

MSDNというクラスが16バイト以下のも良いとして取り扱いstruct [引用].
この理由は何でしょうか?
できない場合はstructは16バイトをするべきだと思うんで効率的ではないクラスでは同一者でもいいですか?
かを判定するためのクラスアップした場合、下の16バイト?
何の制限は、structて行動するかのよう。外disallowing parameterlessコンストラクタ)

役に立ちましたか?

解決

あるカップルで異なる回答では主観的なものの、何らかの理由かを考えることができる:

  • 構造体は値タイプの授業の参考タイプです。使用している場合は、16バイトの総保管、あるんじゃないでしょうかプライベートビーチがありを作成するメモリ参照(4 8バイト)。
  • できたら本当に小さなものが押し出されたILスタックではなく、参照のオブジェクト。ここで本当に速いのコードとしてだけを排除するメモリー逆参照の相手先です。
  • あのプレゼンテーションも堂々と"フラフ"に伴う授業におけるILなデータ構造は非常に小さいので、このフラフを使うこともなう追加のジャンクですよね。

最も重要な差がある構造体やクラスであることが構造体が値型の授業の参考タイプです。

他のヒント

「効率的」とは、彼らはおそらくそれがクラスまたは構造体を表すために要するメモリの量を話している。

は、32ビットプラットフォームでは、オブジェクトを割り当てると、16バイトの最小値を必要とします。 64ビットプラットフォーム上で、最小オブジェクト・サイズは24バイトです。あなたが使用するメモリの量から純粋にそれを見ているのであれば、データの16バイト未満が含まれている構造体は、対応するクラスよりも「より良い」となります。

しかし、メモリの使用量は、全体の話ではありません。値型(構造体)は、参照型(クラス)より根本的に異なります。構造体はで動作するように不便なことができ、あなたが注意しないなら、実際にパフォーマンス上の問題を引き起こす可能性があります。

本当の答えは、もちろん、あなたの状況に最も適した方を使用することです。ほとんどの場合、あなたはクラスを使用してオフにはるかに良いでしょう。

私はSO今日で答えの一つにそれを発見した、このリンクをチェックしてください。 NETタイプの内部に。また、SO検索や構造体とクラスの違いについては、「値型対参照型」のためにグーグルで試すことができます。

  
    

どのようなクラスのような演技から構造体を制限しますか?

  

多くの違いがあります。あなたは、例えば、構造体から継承することはできません。

あなたは仮想メソッドを持つことができませんので、あなたは、インターフェイスを実装する構造体を使用することはできません。構造体におけるインスタンスメソッドは、構造体のプライベートフィールドにアクセスすることができますが、離れて、彼らはauxilirary「ヘルパー」機能のような多くのことを振る舞うことから、(不変の構造体のために、彼らは時にはプライベートなデータにアクセスする必要はありません)。だから私は彼らがいないなどの近くにクラスメソッドとして「貴重」などであることがわかります。

これは、CLRは、構造体やクラスを処理する別の方法によるものです。構造体は、彼らがスタック上ではなく、マネージヒープに住んでいることを意味する値のタイプです。あなたがメソッドの引数として渡す始めるとメソッドに渡されたときの構造体は、その全体がコピーされるあなたはオーバーヘッドが発生しますので、小さな構造体を維持するために親指の良いルールです。

クラスはメソッドへの参照のコピーを渡すので、メソッドの引数として使用した場合、

は、彼らははるかに少ないオーバーヘッドが発生します。

あなたのクラスのサイズを決定する最良の方法は、すべてのクラスのメンバーに加えCLRオーバーヘッドもののための余分な8バイト(シンクブロックインデックスとの種類を参照することにより、必要なバイト数を合計することですオブジェクト)。

彼らは、ヒープにスタックに保存されている、とされていないため、

構造体は、クラスとは異なります。それはあなたがパラメータとして構造体とメソッドを呼び出すたびに、コピーが作成され、メソッドに渡されることを意味します。大規模な構造体は非常に非効率的である理由です。

例えば:それはいくつかの微妙なバグを引き起こす可能性があるため、

私は積極的に、それにもかかわらず、構造体を使用することを阻止するだろうあなたは、構造体のフィールドを変更するとき(あなたが唯一のコピー変更されたため)、その呼び出し元に反映させるつもりはない - 。クラスへの完全に異なる動作です。

だから私は考えて16のバイトは、構造体の合理的な最大サイズですが、それでもほとんどの場合、クラスを持っている方が良いです。それでも構造体を作成したい場合は、少なくともそれは不変にしよう。

クラスが複数のポインタのように動作する一方、

メモリにおいて、構造体は、直接データを保持します。すなわち、単独クラスは値への参照を通過しながらその値を通過するメソッドへのパラメータとして構造体を通過するので、(スタック上にコピーする)、重要な違い。構造体が大きい場合は、各メソッド呼び出しの値の多くがコピーされます。それは本当に小さいときに値をコピーし、それらを直接使用すると、ポインタをコピーして別の場所からそれらをつかむために持つよりも、おそらく速くなります。

の制限について:あなたは(あなたがのNullable <>を使用することができますが)、それはnullに割り当てることはできません、あなたはすぐにそれを初期化する必要があります。

構造体のインスタンスをコピーすると、古いものからクラスおよびコピーデータの新しいインスタンスを作成するよりも時間がかかりますが、クラスのインスタンスを共有することができ、構造体のインスタンスはできません。したがって、「structvar1 = structvar2」「classvar1 = classvar2が」可能一方、新しい構造体インスタンスをコピーする必要classvar1と(新しいものを作成することなく)同一の構造体のインスタンスを参照classvar2。

新しい構造体のインスタンスの作成を処理するコードは、16バイトまでのサイズに最適化されています。より大きな構造体はあまり効率的に処理されています。構造体は、構造体を保持しているすべての変数(すなわち、任意の特定の2つの変数が同一のインスタンスを保持することを期待する理由はありません)の独立したインスタンスを保持する場合に勝利しています。彼らは多くの変数が同じインスタンスを保持できる場合には(彼らはすべてで勝利している場合)勝利の多くではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top