2009-05-26 11 views

Odpowiedz

0

Tablica bajtów. Spowoduje to zapisanie tekstu jako znaków ASCII (1 bajt na znak), podczas gdy ciąg .NET używa Unicode, które są większe. Należy jednak pamiętać, że ciągi .NET są prawdopodobnie bardziej użyteczne iw dużym zastosowaniu różnica prawdopodobnie nie spowoduje dużej różnicy.

(uwaga również, że jeśli tylko używać znaków ASCII w ciąg .NET następnie znaki nadal będzie tylko 1 bajt każdego)

+0

Niesamowita pierwsza odpowiedź, koleś! +1 – Randolpho

+0

Bardzo BARDZO pouczająca odpowiedź. Jestem bardzo wdzięczny za informację. Nie mogę tego wystarczająco podkreślić, ale DZIĘKUJĘ! –

+0

Jeśli przechowujesz go jako tablicę bajtów, będziesz mógł przechowywać tylko ASCII - jeśli potrzebujesz rozszerzonych znaków UTF8, użyj łańcucha i weź hit pamięci, jeśli ważne jest zapisanie kilku bajtów. – thecoop

1

Obie są całkiem blisko. Tylko jedna prawdziwa odpowiedź:

Zapoznaj się z nią w swojej strukturze/architekturze.

0

Tablica bajtów zajęłaby mniej pamięci, gdyby nie kilka kopii ciągu, w którym to przypadku ciąg zajęłby mniej pamięci dzięki tablicy napisów.

Ale prawdziwe pytania: , czy to naprawdę ma znaczenie? Istnieje wiele korzyści, które można uzyskać, wykorzystując ciąg jako łańcuch, zamiast przechowywać go jako tablicę bajtów.

Nie znam szczegółów, ponieważ twoje pytanie było bardzo wąskie, ale wyczuwam przedwczesną optymalizację.

0

Jest dobry blogu here że daje równanie ile miejsca string zajmuje, a także różne interakcje z StringBuilder & przydział instancji

12

To zależy od kodowania znaków w tablicy bajtów. Możesz przekonwertować dowolny ciąg znaków na tablicę bajtów, ale musisz wybrać kodowanie; nie ma jednego standardowego lub poprawnego kodowania. To, co kiedyś nazywano ASCII, nie ma sensu poza światem anglojęzycznym.

W większości kodowań "Mój tekst" miałby 7 bajtów długości. Ale rzucić niektóre europejskie znaki z akcentem lub japońskie, a te (jeśli mogą być w ogóle reprezentowane) mogą mieć więcej niż jeden lub dwa bajty każdy. W niektórych kodowaniach, z pewnymi łańcuchami tekstowymi, reprezentacja tablicy bajtów może być większa niż wewnętrzna reprezentacja Unicode używana przez System.String.

+2

IMO, lepsza odpowiedź niż zaakceptowana, ponieważ podkreśla znaczenie wyboru kodowania. –

+0

Nie ma sprawiedliwości na świecie, mówię ci. –

2

Bycie Unicode nie oznacza, że ​​ciąg zajmie więcej niż jeden bajt na znak, oznacza to tylko, że "może" zająć więcej niż jeden bajt na znak.

http://www.joelonsoftware.com/articles/Unicode.html

+0

To zależy od typu unicode. UTF16 zajmuje więcej niż jedną postać na znak –

+0

Dokładnie, jak już powiedziałem ... to "może". W swoim komentarzu pomieszałeś także "znak" i "bajt". –

1

Czym zajmuje więcej pamięci?

Pytasz o rozmiar reprezentacji w pamięci w pamięci. NET wykorzystuje UTF-16 ciągów, co oznacza, że ​​swoją przykładzie być reprezentowane przez 14 bajty, jak to widać w tym niezdatny (UTF-16LE)

4d 00 79 00 20 00 54 00 65 00 78 00 74 00 

wielkości tablicy bajtów będzie zależeć od kodowania, którego używasz do reprezentowania tekstu.Jeśli używasz UTF-16, jak to

Encoding.Unicode.GetBytes(string) 

to oczywiście uzyskać te same 14 bajtów. Jeśli używasz UTF-8 zamiast:

Encoding.UTF8.GetBytes(string) 

masz tablicę z 7 bajtów:

4d 79 20 54 65 78 74 

Jest to ten sam rozmiar (i tym samym reprezentacja) jako ASCII, ponieważ Twój przykład używa tylko znaków dostępnych w zestawie znaków ASCII. Wszystkie te znaki są z definicji identyczne w UTF-8.

Teraz jeśli używasz znaki spoza ASCII zamiast, powiedzmy japońskiego "maj", kodowanie UTF-8 musiałby 3 bajty:

e6 97 a5 

UTF-16 musiałyby tylko 2 bajty:

e5 65 

Próba konwersji japońskiego znaku na ASCII może spowodować wyjątek lub po prostu użyć znaku "?" znak, w zależności od konfiguracji Encoding, ponieważ ASCII nie może reprezentować niczego oprócz znaków ASCII.

Kolejny nieco inny przykład, europejski znak "ä". 2 bajty w UTF-8:

c3 a4 

także 2 bajtów UTF-16:

e4 00 

ASCII nie może reprezentować tę postać.

Podsumowując, zużycie pamięci zależy od rzeczywistych danych w łańcuchach i kodowania, którego używasz do reprezentowania go.

Wszystkie powyższe mówi o zużyciu pamięci dla surowych danych tylko pamiętać, że w celu obliczenia całkowitego zużycia pamięci chcesz mieć również zawierać metadane który jest częścią każdej tablicy i ciąg, taki jak jego o długości, a także w przypadku ciągów .net także z terminatorem o wartości Null (2 dodatkowe bajty o wartości "0"). Liczba bajtów dla metadanych jest stała i względnie mała, więc jakakolwiek różnica między ciągiem a tablicą ma znaczenie tylko wtedy, gdybyś miał mnóstwo bardzo małych tekstów.

Powiązane problemy