Perl: ограничения длины строки в реальной жизни
в то время как, например, perldata документы, скалярные строки в Perl ограничены только доступной памятью, я сильно подозреваю, что в реальной жизни будут некоторые другие ограничения.
Я рассматриваю следующие идеи:
- Я не уверен, как строки реализованы в Perl - есть ли какой-то счетчик байтов/символов? Если есть, то, вероятно, он реализован как зависящее от платформы целое число( т. е. 32-разрядное или 64-разрядное), поэтому эффективно это ограничило бы строки чем-то вроде
2 ** 31
,2 ** 32
,2 ** 63
или2 ** 64
байт. - если Perl не использует счетчик и вместо этого использует некоторый байт для завершения строки (что было бы странно, так как совершенно нормально иметь строку типа "foobar" в Perl), то все операции неизбежно будут намного медленнее по мере увеличения длины строки.
- большинство строковых функций, которые Perl имеет дело со строками, такими как длина, например, вернуть нормальный скаляр integer, и я сильно подозреваю, что это будет целое число с ограниченной платформой.
Итак, каковы были бы другие факторы, ограничивающие длину строки Perl в реальной жизни? Что следует считать допустимой длиной строки для практических целей?
1 ответов
он отслеживает размер буфера и количество байтов в нем.
$ perl -MDevel::Peek -e'$x="abcdefghij"; Dump($x);'
SV = PV(0x9222b00) at 0x9222678
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x9238220 "abcdefghij"
CUR = 10 <-- 10 bytes used
LEN = 12 <-- 12 bytes allocated
в 32-разрядной сборке Perl для этих значений используется 32-разрядное целое число без знака. Это (точно) достаточно большой, чтобы создать строку, которая использует все адресное пространство вашего процесса 4 GiB.
в 64-разрядной сборке Perl для этих значений используется 64-разрядное целое число без знака. Это (точно) достаточно большой, чтобы создать строку, которая использует ваш процесс всего 16 EiB адресного пространства.
документы правильные. Размер строки ограничен только доступной памятью.