2016-09-04 81 views
3

我已經閱讀了不少的數據局部性帖子,但沒有找到答案:如果我創建一個結構數組以獲得連續的內存塊(讓我們說MyStruct,它是由值類型組成),然後向我的MyStruct添加一個字符串,其中字符串分配在哪裏?簡而言之,被聲明爲結構成員的引用類型是數組中的項目,在獲取緩存行時可以很好地發揮作用。或者我最終得到一個引用,然後該引用必須被定位,這首先打破了創建結構數組的全部目的?C#數據局部性:結構數組中的引用類型

我相信我的措辭正確,但我覺得它有點滑。

我很感激你的時間。

編輯:我知道該字符串在堆中分配,只是想知道關於連續方面...

回答

1

鑑於:

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

MYSTRUCT []將具有近乎相同的佈局,以字符串[] - 也就是說,你有4/8字節參照字符串實例的鄰接陣列,你可以例如與object.ReferenceEquals(...)比較而不觸及非連續的數據。然而,字符串實例本身 - 關於長度,散列,字符,香草相等的數據(因爲字符串重載==在這些方面)等等 - 不是這個連續塊的一部分,因爲字符串是引用類型。

這仍然比MyClass的[]更好,然而,這將是4/8字節的連續陣列引用 MyClass的實例 - 即,MyClass的實例本身將不會被鄰近的 - 這反過來又具有另一個對字符串的4/8字節引用,它也不會是連續的。

因此,使用成員意味着你幾乎可以肯定會處理一些非連續的數據,但是使用結構仍然會爲你節省一層間接尋址。

+2

我猜'結構MyClass {字符串成員; }'be be'class MyClass {string Member; }'。 – NikolayKondratyev

+0

好趕上!編輯修復。 – MaulingMonkey

+0

這很清楚,我很感激。我沒有想過'節省一層間接'這個部分,這當然是有意義的。 –

0

引用類型總是在堆中作爲獨立的對象進行分配。他們從未被內聯到其他東西。

類型作者選擇分配風格和類型用戶沒有選擇。這是因爲實現通常依賴於分配語義。如果強迫他們表現得像結構一樣,許多類就無法正常工作。

+0

您提到了'類型作者'。我會做一些研究。第一段是正確的,這很好:沒有華麗b.s.讀完之後,我可以很容易地想象一下,具有ref類型的ref類型的噩夢ref類型將來自數據局部性的角度以及爲什麼。 –

+0

類型作者不是一個技術術語。這是他寫課程的人。在C++中,類型不關心它被分配的位置,因爲所有可能的位置都是相同的:對象由其地址標識,它始終具有同一意義(或者始終不取決於解釋)。此外,沒有GetHashCode,並不是所有C++結構都是默認可構造的。這就是C++如何避免這個問題。 – usr