2016-09-04 24 views
3

私は相当数のデータローカリティのポストを読みましたが、これに対する答えは見つかりませんでした:連続したメモリブロックを持つために構造体の配列を作成すると値の型で構成されているMyStructとし、MyStructに文字列を追加します。文字列はどこに割り当てられていますか?要するに、配列の項目である構造体のメンバーとして宣言された参照型は、キャッシュの行を取得するのにうまくいきますか?あるいは、最初に構造体の配列を作成する目的を吹き飛ばしている参照を取得しなければなりません。C#データの局所性:構造体の配列の参照型

私はこれを正しく言いましたが、少し滑りやすいと思います。

お時間をいただきありがとうございます。

編集:私は、文字列がちょうど

答えて

1

struct MyStruct { string Member; } class MyClass { string Member; }

は体mystruct [] []の文字列とほぼ同じレイアウトを持つことになります - つまり、あなたは文字列インスタンスに4/8バイト参照の連続した配列を持っています、それはあなたがすることができますObject.ReferenceEquals(...)と比較して、非連続データには触れないでください。しかし、ストリングインスタンス自体は長さ、ハッシュ、文字、バニラ平等(これらのものに関しては文字列オーバーロード==なので)などのデータは、stringが参照型であるため、この連続ブロックの一部ではありません。

これは MyClassのインスタンスに4/8バイト参照の連続した配列になりますこれは、しかし、[]まだMyClassのよりも優れている - つまり、MyClassのインスタンス自体が連続していないだろう - 今度は持っています別の文字列への4/8バイトの参照。これも連続しません。

メンバーを意味する意味で使用するということは、ほとんどの場合、非連続データを扱うことを意味しますが、構造体を使用すると、1つの間接指定が保存されます。

+2

私は 'struct MyClass {string Member; } 'shoul be' class MyClass {文字列メンバ;} } '。 – NikolayKondratyev

+0

良いキャッチ!修正するように編集しました。 – MaulingMonkey

+0

これは非常に明確で、私はそれを感謝します。私は間接的な部分の節約については考えていませんでしたが、それは確かに意味があります。 –

0

参照型は常に独立したオブジェクトとしてヒープに割り当てられている...の連続する側面に疑問を抱いて、ヒープ上に割り当てられている実感。彼らは決して他のものにインライン化されません。

タイプ作成者は割り当てスタイルを選択し、ユーザーは選択肢がありません。これは、実装が通常は割り当てのセマンティクスに依存するためです。多くのクラスは、構造体のように動作させると正しく機能できませんでした。考える

+0

あなたは 'タイプ作者'に言及しました。私はそれについていくつかの研究をします。最初のパラグラフはポイントまでは正解でした。いいですね。それを読んだ後、私は簡単にナイトメアのref型がref型を持つref型を持つことは、データの局所性の観点からのものであると考えています。 –

+0

タイプ著者は専門用語ではありません。クラスを書くのは彼です。 C++では、型はどこに配置されても問題ありません。オブジェクトはそのアドレスによって識別され、常にその意味での識別情報を持ちます(または常に解釈に依存しません)。また、GetHashCodeはなく、すべてのC++構造体がデフォルトで構成可能であるわけではありません。それがC++がこの問題を回避する方法です。 – usr

関連する問題