jak są one przechowywane
Zarówno string
i char[]
są przechowywane na stercie - więc przechowywanie jest taka sama. Wewnętrznie zakładam, że string
jest po prostu osłoną dla char[]
z partii dodatkowego kodu, aby był dla ciebie przydatny.
Również jeśli masz dużo powtarzających się ciągów, możesz użyć wartości Interning, aby zmniejszyć ślad pamięci tych ciągów.
lepszym rozwiązaniem
chciałbym faworyzować ciąg - to od razu bardziej widoczne, co typ danych jest i jak zamierzasz go używać. Ludzie są również bardziej przyzwyczajeni do używania łańcuchów, więc konserwacja nie ucierpi. Zyskasz także wiele korzyści z całego kodu standardowego, który został zrobiony dla ciebie. Firma Microsoft dokłada również wszelkich starań, aby upewnić się, że typ string
nie jest technologią wydajności.
alokacji Rozmiar
nie mam pojęcia, ile jest alokowana, wierzę ciągi są całkiem skuteczne w tym, że tylko przeznaczyć wystarczająco do przechowywania znaków Unicode - ponieważ są one niezmienne jest to bezpieczne, aby to zrobić . Tablic nie można również zmienić rozmiaru bez przydzielania miejsca w nowej tablicy, więc ponownie zakładam, że pobierają tylko to, czego potrzebują.
Overhead of a .NET array?
Alternatywy
na podstawie informacji, że istnieją tylko 20 kody językowe i wydajność jest kluczowa, można zadeklarować swoją enum w celu zmniejszenia wielkości wymaganej do reprezentowania kodów:
enum LanguageCode : byte
{
en = 0,
}
ten będzie jedynie 1 bajt w przeciwieństwie do 4+ dla dwóch char
(w tablicy), ale nie ogranicza zakresu dostępny w miejscach e LanguageCode
wartości do zakresu byte
- co jest więcej niż wystarczająco duże dla 20 elementów.
Możesz zobaczyć rozmiar typów wartości za pomocą operatora sizeof()
: sizeof(LanguageCode)
. Wyliczenia są tylko podstawowym typem pod maską, domyślnie są to int
, ale jak widać w moim przykładzie kodu, można to zmienić, "dziedzicząc" nowy typ.
Czy udowodniłeś sobie, że to już problem? Bardzo rzadko zdawałem sobie sprawę z potrzeby martwienia się o pamięć podczas korzystania z ciągów - zwłaszcza takich małych. Jeśli nie pojawia się jako problem, nie przejmuj się nim, dopóki nie pojawi się. To łatwa łatka w późniejszym terminie, jeśli łańcuchy powodują problem z pamięcią. W przeciwnym razie użyj łańcucha i nawet nie myśl o problemach z pamięcią. –
Mam bardzo intensywną logikę, która przechowuje tysiące z nich w pamięci, więc każda mała pomaga. –
@ William Jeśli wydajność jest tak ważna, dlaczego nie zadeklarować 'enum LanguageCode: short' i zapisać 2 bajty? –