2010-08-11 16 views
1

使用C#,是否有任何開銷讓一個大對象包含大量字符串變量 - 其中一半從未在同一實例中使用,而不是包含一半的兩個對象所有變量將在所有實例中使用的字符串變量的數量?C#:在對象中有未使用變量的開銷

我的問題實際上可能是:在對象中有大量空字符串變量會有什麼開銷?我正在談論20個未使用的字符串變量。

回答

2

Miniscule。甚至不要爲此而流汗。

這就是說,從設計的角度來看,這可能是一個壞主意。

6

20個未使用的字符串變量可能會浪費每個實例80或160個字節,具體取決於您使用的是32位還是64位CLR。每個字段的值將是一個參考,這就是爲什麼它依賴於CLR。 (有可能更浪費,由於填充;這取決於物體的細節)

這是否是顯著將取決於有多少你使用這些對象 - 顯然你把更多的空間,垃圾收集器將不得不工作得越多,應用程序將承擔的內存就越多。如果你有一百萬個這樣的對象在任何一個點上「活着」,他們將浪費大約80或160MB。這很重要嗎?這取決於你的情況。

+0

對32位上的20個字符串,確保大約80個字節?這裏有人說每個實例有額外的20個字節:http://www.yoda.arachsys.com/csharp/strings.html#memory – Kamarey 2010-08-11 06:27:42

+2

@Kamarey:這是關於字符串*實例*的討論。未使用的字符串變量通常會保存空引用,而不是對新創建的字符串的引用。 (我不知道你是否在開玩笑,但你知道我寫了那篇文章,對不對?) – 2010-08-11 06:31:34

+0

是的,我知道你寫了它。剛剛錯過了談到空引用。 – Kamarey 2010-08-11 08:25:54

1

.NET中的字符串是interned,這意味着整個應用程序中只有一個唯一字符串實例。唯一的開銷將是對該字符串的引用(本質上是一個指針),並且它是非常小的擔心。 編輯正如Jon所評論的那樣,字符串只是在字符串文字(如var str = "literal";)中才被實施,但如果需要,可以手動方便地實現字符串,如MSDN鏈接所示。

不要圍繞可能節省幾個字節的方式來構造類,讓您的類儘可能易讀並易於使用。運行時非常聰明,並會爲您處理運行時性能。

+1

您可以很容易地在.NET中有多個相同字符串的實例。只有字符串*文字*或者明確*代碼實現的字符串才被實施。但是,在這種情況下,實際字符串對象所需的空間是不相關的,因爲這些字符串變量將不會被使用(因此默認情況下,它的值爲'null')。 – 2010-08-11 06:24:23

+0

@Jon:它們可能是String.Empty – CJ7 2010-08-11 07:07:26

+0

@Craig:只有當你明確地設置它們時 - 在這種情況下,它們都會引用同一個空字符串,而這個空字符串本來可以被初始化。換句話說,除了我上面描述的之外,沒有額外的成本。 – 2010-08-11 07:16:24

0

Fyodor在我看來是對的。 這個觀點可能不是開銷,但是如果有很多空字符串對於精化流程或者只是一個糟糕的設計問題纔是真正有用的。 在這第二種情況下,您需要考慮您的個人開銷,以維護這麼龐大的代碼。