Соответствует ли длина строки размеру байта? - PullRequest
15 голосов
/ 03 января 2009

Именно так: Соответствует ли длина строки размеру байта? Имеет ли значение язык?

Я думаю, что да, но я просто хочу убедиться.

Дополнительная информация: мне просто интересно в общем. Моя конкретная ситуация была PHP с MySQL.

Поскольку ответ - нет, это все, что мне нужно знать.

Ответы [ 6 ]

47 голосов
/ 03 января 2009

Неа. Строка с нулем в конце имеет один дополнительный байт. У строки паскаля (короткая строка Delphi) есть дополнительный байт для длины. И строки Unicode имеют более одного байта на символ.

По юникоду это зависит от кодировки. Это может быть 2 или 4 байта на символ или даже смесь из 1,2 и 4 байтов.

23 голосов
/ 03 января 2009

Это полностью зависит от платформы и представительства.

Например, в .NET строка занимает два байта в памяти на кодовую точку UTF-16. Однако суррогатным парам требуются два значения UTF-16 для полного символа Юникода в диапазоне от U + 100000 до U + 10FFFF. Форма в памяти также имеет накладные расходы на длину строки и, возможно, некоторые отступы, а также обычные накладные расходы объекта указателя типа и т. Д.

Теперь, когда вы записываете строку на диск (или в сеть и т. Д.) Из .NET, вы указываете кодировку (большинство классов по умолчанию используют UTF-8). В этот момент размер очень сильно зависит от кодировки. ASCII всегда берет один байт на символ, но очень ограничен (без акцентов и т. Д.); UTF-8 предоставляет полный диапазон Unicode с переменной кодировкой (все символы ASCII представлены одним байтом, но другие занимают больше). UTF-32 всегда использует ровно 4 байта для любого символа Unicode - список можно продолжить.

Как видите, это не простая тема. Чтобы определить, сколько места займет строка, вам нужно указать точно какова ситуация - является ли это объектом в памяти на какой-либо платформе (и если да, то какая платформа - потенциально даже вплоть до параметров реализации и операционной системы), или является ли это необработанной кодированной формой, такой как текстовый файл, и, если да, то какой кодировкой.

6 голосов
/ 03 января 2009

Это зависит от того, что вы подразумеваете под "длиной". Если вы имеете в виду «количество символов», то нет, многие языки / методы кодирования используют более одного байта на символ.

3 голосов
/ 03 января 2009

Там нет однозначного ответа; это зависит от реализации языка и (помните, что некоторые языки имеют несколько реализаций!)

Строки ASCII с нулем в конце занимают как минимум на один байт больше, чем "содержимое" строки. (Может быть выделено больше, в зависимости от того, как была создана строка.)

Строки, не оканчивающиеся нулем, для записи длины используют дескриптор (или аналогичную структуру), который занимает дополнительную память где-то .

Строки Unicode (на разных языках) используют два байта на символ.

На строки в хранилище объектов можно ссылаться через дескрипторы, что добавляет слой косвенности (и больше данных) для упрощения управления памятью.

3 голосов
/ 03 января 2009

Не всегда, это зависит от кодировки.

2 голосов
/ 03 января 2009

Вы правы. Если вы кодируете как ASCII, то есть один байт на символ. В противном случае это один или несколько байтов на символ.

В частности, важно знать, как это влияет на операции подстроки. Если у вас нет одного байта на символ, s [n] получает n-й байт или n-й символ? Получение n-го символа будет неэффективным для больших n вместо констант, как это происходит с одним байтом на символ.

...