LINUX.ORG.RU

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

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

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

Только ровно наоборот происходит: это в Си при попытке плотно работать со строками в программе появляются кучи счётчиков и индексов и сотни функций. Или это будет тормозная и потенциально небезопасная программа.

Чтобы ты не говорил, что длину специально узнавать не надо, но ты упускаешь, что длину бывает надо знать до обработки строки. Вот тебе простейшие примеры, вызывающие тормоза без подпорок с отдельными счетчиками длин и индексами:

1) Надо strcat нескольким строкам сделать. В лоб стандартным образом это будет считай O(N^2) .

2) Сравнение строк с конца, поиск суффиксов. Например, быстро проверить имя файла на нужное расширение. Если заранее не знать длины строки, то это O(N), если знать, то O(1).

3) Парсинг чего-то. Надо постоянно создавать подстроки и передавать в другие функции. В итоге или временно модифицируем исходный буфер (что потоконебезопасно и портит данные), либо на каждом шаге дрочиться с malloc+strncpy для выделения кусочков. А для strncpy опять нужно знать размеры, что приводит к лавинообразному росту вызовов сканирования памяти. Или таки обрастает вся работа лишними индексами и счётчиками.

4) Пакетная обработка с SIMD-инструкциями. Если заранее известен размер строки её можно сразу пачками (до 64 байт у AVX512) раскидать по регистрам.

P.S. И это я ещё про потенциальные ошибки безопасности с буфером молчу.

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

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

Только ровно наоборот происходит: это в Си при попытке плотно работать со строками в программе появляются кучи счётчиков и индексов и сотни функций. Или это будет тормозная и потенциально небезопасная программа.

Чтобы ты не говорил, что длину специально узнавать не надо, но ты упускаешь, что длину бывает надо знать до обработки строки. Вот тебе простейшие примеры, вызывающие тормоза без подпорок с отдельными счетчиками длин и индексами:

1) Надо strcat нескольким строкам сделать. В лоб стандартным образом это будет считай O(N^2) .

2) Сравнение строк с конца, поиск суффиксов. Например, быстро проверить имя файла на нужное расширение. Если заранее не знать длины строки, то это O(N), если знать, то O(1).

3) Парсинг чего-то. Надо постоянно создавать подстроки и передавать в другие функции. В итоге или временно модифицируем исходный буфер (что потоконебезопасно и портит данные), либо на каждом шаге дрочиться с malloc+strncpy для выделения кусочков. А для strncpy опять нужно знать размеры, что приводит к лавинообразному росту вызовов сканирования памяти. Или таки обрастает вся работа лишними индексами и счётчиками.

4) Пакетная обработка с SIMD-инструкциями. Если заранее известен размер строки её можно сразу пачками (до 64 байт у AVX512) раскидать по регистрам.