LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Ничего не странное. В DOS и наверно CP/M есть ещё $-терминированные строки в одном месте.

Дело было только в экономии памяти на дополнительный указатель на конец строки, или?

Не столько экономия чуть-чуть памяти, сколько большая экономия в сложности многих алгоритмов. Кроме твоего варианта есть ещё другие, итого:

1) строка, терминированная спецсимволом (null или не null, не особо важно)

2) строка, для передачи которой надо слать два указателя (твой вариант)

3) строка, для передачи которой надо слать указатель и длину

4) строка, у которой длина записана в начале выделенной ей области памяти

5) строка, у которой указатель на конец записан в начале выделенной ей области памяти

6) строка, состоящая из двух выделенный блоков памяти, один с двумя указателями либо указателем+длиной, второй собственно с данными

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

Во вариантах 2 и 3 замусоривается не только код собственно обработки строк, но и все места, где строки вообще упоминаются.

Вариант 4 получается либо зависящим от платформы (т.е. его нельзя сдампить в файл как есть), либо ограничивающим длину строки непонятными ограничениями (если длина фиксрованной битности). Вариант 5 зависящий от платформы и, хуже того, от расположения строки в памяти (нельзя не только сдампить, но и побайтово скопировать). Оба варианта 4 и 5 не дадут скользить вдоль строки, переставляя её начало на новое место.

Вариант 6 устраивает разные проблемы с аллокатором памяти, когда ты не знаешь что там выделено статически а что динамически.

У варианта 1 конечно тоже есть недостаток: невозможность быстро узнать длину строки. Но он видимо не таокй существенный как остальное перечисленное.

Впрочем, варианты 3 и 6 в Си тоже используют. А вот твой с двумя указателями я где-то видел но очень мало. Причём 6 можно дальше развивать, но это уже не просто строка а буфер с дополнительным функционалом.

Исходная версия firkax, :

Ничего не странное. В DOS и наверно CP/M есть ещё $-терминированные строки в одном месте.

Дело было только в экономии памяти на дополнительный указатель на конец строки, или?

Не столько экономия чуть-чуть памяти, сколько большая экономия в сложности многих алгоритмов. Кроме твоего варианта есть ещё другие, итого:

1) строка, терминированная спецсимволом (null или не null, не особо важно)

2) строка, для передачи которой надо слать два указателя (твой вариант)

3) строка, для передачи которой надо слать указатель и длину

4) строка, у которой длина записана в начале выделенной ей области памяти

5) строка, у которой указатель на конец записан в начале выделенной ей области памяти

6) строка, состоящая из двух выделенный блоков памяти, один с двумя указателями либо указателем+длиной, второй собственно с данными

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

Во вариантах 2 и 3 замусоривается не только код собственно обработки строк, но и все места, где строки вообще упоминаются.

Вариант 4 получается либо зависящим от платформы (т.е. его нельзя сдампить в файл как есть), либо ограничивающим длину строки непонятными ограничениями (если длина фиксрованной битности). Вариант 5 зависящий от платформы и, хуже того, от расположения строки в памяти (нельзя не только сдампить, но и побайтово скопировать). Оба варианта 4 и 5 не дадут скользить вдоль строки, переставляя её начало на новое место.

Вариант 6 устраивает разные проблемы с аллокатором памяти, когда ты не знаешь что там выделено статически а что динамически.

У варианта 1 конечно тоже есть недостаток: невозможность быстро узнать длину строки. Но он видимо не таокй существенный как остальное перечисленное.