Паскалевские строки в Си (ANSI C)

Модератор: Модераторы разделов

Аватара пользователя
Victor Gr.
Сообщения: 98

Паскалевские строки в Си

Сообщение Victor Gr. »

Вопрос вот какой.
Имея дело с ANSI C, строки предтавляются в виде массива, завершающегося \0.

И такой вариант представления строк есть не самый быстрый для обработки.

Как вариант - Паскалевские строки, где первый байт - это длина строки.

Есть ли в языке Си возможность работать с такими строками?
Я так полагаю, это может быть реализовано библиотеками?

Или же это можно реализовать самому?
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: Паскалевские строки в Си

Сообщение oav »

Victor Gr. писал(а):
10.03.2006 13:46
Или же это можно реализовать самому?
[font]

Да. Обсолютно все можно реализовать самому на С. Аналог паскалевских строк в Win32 API - BSTR
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Паскалевские строки в Си

Сообщение serzh-z »

Victor Gr. писал(а):
10.03.2006 13:46
Есть ли в языке Си возможность работать с такими строками?


Встроенной, в простом C - нет.
Спасибо сказали:
Nab
Сообщения: 257

Re: Паскалевские строки в Си

Сообщение Nab »

Victor Gr. писал(а):
10.03.2006 13:46
Вопрос вот какой.
Имея дело с ANSI C, строки предтавляются в виде массива, завершающегося \0.
Они нынче также представляются и в Делфи, чтобы использовать старый формат строк нужно указывать тип ShortString.
Victor Gr. писал(а):
10.03.2006 13:46
И такой вариант представления строк есть не самый быстрый для обработки.

Разницы в обработке нет абсолютно.... все зависит от подхода, я у себя в реализации парсера XML когдато отказался от встроенных функций и писал свои которые мне дали восьмикраный выиграш в скорости, но возможно были не так переносимы как стандартные...

Victor Gr. писал(а):
10.03.2006 13:46
Как вариант - Паскалевские строки, где первый байт - это длина строки.

А Вас не смущает ограничение строки в 255 символов именно из за того что один байт....

Victor Gr. писал(а):
10.03.2006 13:46
Есть ли в языке Си возможность работать с такими строками?
Я так полагаю, это может быть реализовано библиотеками?

Или же это можно реализовать самому?

Реализация будут немного кривовата :(
потому как паскаль работает с ними нативно, динамически распределяя память, и к сожалению той же красоты реализации будет тяжело добиться :(
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Паскалевские строки в Си

Сообщение t.t »

И кстати, откуда сведения, что "паскалевская" реализация быстрее? Потому как я часто слышу и тако, и обратное мнение.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
Victor Gr.
Сообщения: 98

Re: Паскалевские строки в Си

Сообщение Victor Gr. »

t.t писал(а):
10.03.2006 18:24
И кстати, откуда сведения, что "паскалевская" реализация быстрее? Потому как я часто слышу и тако, и обратное мнение.


По здравому смыслу даже.

Что нужно сделать, чтобы склеить две строки ASCIZ и паскалевская?..

А Вас не смущает ограничение строки в 255 символов именно из за того что один байт....


Ну можно ведь и два и три байта выделить на длину строки ;)
Оверхед в 3 байта - это допустимо, если скорость обработки увеличивается! )
Спасибо сказали:
Nab
Сообщения: 257

Re: Паскалевские строки в Си

Сообщение Nab »

Victor Gr. писал(а):
10.03.2006 19:27
t.t писал(а):
10.03.2006 18:24

И кстати, откуда сведения, что "паскалевская" реализация быстрее? Потому как я часто слышу и тако, и обратное мнение.


По здравому смыслу даже.

Что нужно сделать, чтобы склеить две строки ASCIZ и паскалевская?..

Абсолютно одно и тоже ...
Как раз по здравому смыслу быстрее в сроках с нулем...
потому как getmem и copymem из двух буферов ясно и понятно, а паскаль неизвестно что там колбасит и как расставляет строки, если вы сложите две строки объявленные как string[15] и заполненные больше чем на половину..., и потом попробуйте сложить две строки с количеством символов в сумме больше чем 255....
Хотя я подозреваю паскаль делает тоже самое только внутри себя :)....

Victor Gr. писал(а):
10.03.2006 19:27
А Вас не смущает ограничение строки в 255 символов именно из за того что один байт....

Ну можно ведь и два и три байта выделить на длину строки ;)
Оверхед в 3 байта - это допустимо, если скорость обработки увеличивается! )


Да выделяйте сколько угодно, но это не будут уже паскалевские строки в том виде как вы привыкли...
кстати паскаль для String и AnsiString выделяет первые четыре байта (целое), а возвращает указатель на строку+4, и оканчивает их 0....
поверьте так удобней и быстрее :)

для t.t просто паскалевскаие строки красивей и начинающему програмисту кажется что d+f будет работать быстрее чем MyStrAdd(d,f) :) оно тока в исходном коде быстрее пишется :)
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
Victor Gr.
Сообщения: 98

Re: Паскалевские строки в Си

Сообщение Victor Gr. »

Вот тут хорошо аргументировано.
http://russian.joelonsoftware.com/Articles/BacktoBasics.html

У Криса Касперского много по теме в его книге "Техника оптимизации программ: эффективное использованое памяти".
Спасибо сказали:
Nab
Сообщения: 257

Re: Паскалевские строки в Си

Сообщение Nab »

Я видимо плохо объяснил свою мысь...
Вы бы посмотрели в исходниках VCL как там реализованы строки... кроме хранения в первых 4 байтах размера строки, они ничем не отличаются, то есть являются абсолютной копией строк с zero на конце... Другое дело что работа с этими типами данных реализована красиво в паскале, но есть и свои минусы... эти первые четыре байта зачастую мешают при работе, копировании и т.д.
Размер можно хранить также и в C только реализовать это настолько прозрачно как в Паскале не получится :(

А складывание строк операция везде одинаковая все зависит от накладных расходов..
Программы или используют больше памяти и быстрее едут, или лопатят все медленно но занимают мало места.. Это в принципе основа оптимизации по скорости или размеру...
Вот у програмиста и есть главная задача, добиться компроммиса, между двумя этими задачами...
А не как нынче, посмотришь на этих монстров и сразу в DOS хочется :)
Чтобы правильно задать вопрос, нужно знать больше половины ответа...
FREESCO in Ukraine
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Паскалевские строки в Си

Сообщение t.t »

(Victor Gr. @ Mar 10 2006, в 19:27) писал(а):По здравому смыслу даже.

Что нужно сделать, чтобы склеить две строки ASCIZ и паскалевская?..
Обратный пример: выделение подстроки ;-)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали: