Страницы

Oberon-строки с длиной без пересчёта

Как известно, в языке Oberon строку можно поместить в массив CHAR, добавив завершающий 0X. Это приводит к необходимости счёта длины, когда она необходима, что может приводить к избыточным накладным расходам. Но в отличии от языка C в Oberon из-за требования безопасности памяти также всегда доступен размер массива, используемого для хранения строки. Это приводит к возможности хранить длину строки так, чтобы её не приходилось считать.

В последний элемент массива нужно поместить смещение от него до положения завершающего 0Х. Если смещение 0-е, то это приводит к тому, что завершающий 0Х и смещение совпадают. Это означает, что для такого способа хранения длины строки не нужно выделять дополнительное место в массиве и по-прежнему требуется лишь один дополнительный элемент, и значение строк-литералов не требует изменения. Также, такие строки совместимы по чтению с подпрограммами, ничего не знающими о них.

Но что, если разница между размером массива и длиной строки меньше 255? Всё просто — это означает, что в массиве очень много свободного места, поэтому длину строки можно хранить в нём любым удобным способом.

Недостатком может служить более сложная поддержка правильности хранения длины при поэлементной обработке строк в массивах. В то же время подсчёт длины может быть воплощён очень производительно, если вместо поэлементного перебора импользовать векторные инструкции. В пределах длины около 300 такое воплощение остаётя вполне приемлемым, и только при очень больших строках разница становится драматичной.

Комментариев нет:

Отправить комментарий