Соответствует ли длина строки размеру байта?

StackOverflow https://stackoverflow.com/questions/409765

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Поскольку ответ отрицательный, это все, что мне нужно знать.

Это было полезно?

Решение

Неа.Строка, оканчивающаяся нулем, имеет один дополнительный байт.Строка Паскаля (короткая строка Delphi) имеет дополнительный байт для длины.А строки Юникода содержат более одного байта на символ.

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top