2011-04-17 98 views
7

在Java中,一個空字符串是40個字節。在Python中它是20個字節。 C#中的空字符串對象有多大?我不能做sizeof,我不知道如何找出答案。謝謝。sizeof空字符串在C#

回答

9

It's 18 bytes:存儲

16字節+2每字符的字節分配+ 2個字節的最後空字符。

請注意,這是關於.Net 1.1寫的。

m_ArrayLength場在.NET 4.0中移除(你可以看到這個參考源)

+0

任何方式來測試這個?我究竟如何以編程方式發現? – 2011-04-17 02:02:40

+0

您可以使用WinDBG。 – SLaks 2011-04-17 02:03:13

+0

或64位系統上的26個字節,並且不要忘記對齊。 – Random832 2011-04-17 02:05:46

3

喬恩斯基特最近關於這一主題寫了一整article

在x86上,一個空字符串爲16個字節,在x64這是32個字節

+0

@SLaks談到的空字符怎麼樣?這是必要的嗎? – 2011-04-17 02:08:57

+0

@Dervin Thunk,不知道...閱讀文章以獲取更多詳細信息;) – 2011-04-17 02:10:27

+1

16字節對於.NET 4.0 x86是正確的,零終止符適用。最多三個字符,下一個較大的字符串是一個包含4個字符,20個字節的字符串。單聲道最有可能是4個字節。 – 2011-04-17 02:32:11

5

的CLR版本的問題。在.NET 4之前,一個字符串對象有一個額外的4字節字段,用於存儲「容量」m_arrayLength字段。該字段不在.NET 4中。它具有標準對象頭,4個字節用於同步塊,4個字節用於方法表指針。然後4個字節存儲字符串長度(m_stringLength),然後每個字符存儲2個字節。和一個0字符,以使其與本機代碼兼容。對象總是4個字節的倍數,最小16個字節。

因此,一個空字符串是4 + 4 + 4 + 2 = 14個字節,在.NET 4.0上四捨五入爲16個字節。早期版本爲20字節。給定的值是x86。這在調試器中非常明顯,請檢查提示this answer

+0

欣賞它,謝謝。你爲什麼說「最有可能的單聲道將有4個字節」? – 2011-04-17 02:51:43

+0

因爲它基於SSCLI20,而SSCLI20又基於版本2 CLR的源代碼。 – 2011-04-17 02:59:37

+0

那麼'm_arrayLength'還在嗎?大概是 – 2011-04-17 03:01:06