The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Взлом Linux через подключение USB-устройства стал реальностью, opennews (ok), 08-Мрт-11, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


9. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от доброжелатель (?), 08-Мрт-11, 12:11 
Ок, для успешной индексации строк с over 2 млрд. символов всегда надо будет хранить лишних 4 байта, для любой строки, удачи !
Ответить | Правка | К родителю #1 | Наверх | Cообщить модератору

11. "Взлом Linux через подключение USB-устройства стал реальность..."  –3 +/
Сообщение от Аноним (-), 08-Мрт-11, 12:18 
> Ок, для успешной индексации строк с over 2 млрд. символов всегда надо
> будет хранить лишних 4 байта, для любой строки, удачи !

да хоть 8 байт, хоть 32-а, это один фиг лучше, чем рут полученный через переполнение.

Ответить | Правка | Наверх | Cообщить модератору

13. "Взлом Linux через подключение USB-устройства стал реальность..."  +3 +/
Сообщение от Аноним (-), 08-Мрт-11, 12:22 
Т.е. хранить 32 байта с длинной строки, когда сама строка занимает один байт это нормально?
Ответить | Правка | Наверх | Cообщить модератору

18. "Взлом Linux через подключение USB-устройства стал реальность..."  +2 +/
Сообщение от iZEN (ok), 08-Мрт-11, 12:40 
Поле длины строки необязательно должно быть фиксированной длины — есть алгоритмы кодирования длины произвольной последовательности. И лучше, чтобы оно всё-таки было в заголовке данных, а не в конце в виде завершающего нуля, чтобы ядро не занималось счётом байтов и динамическим перевыделением памяти под неизвестное число байтов, пока не будет считан последний байт строки, а заранее знало, сможет оно вместить всю строку в доступную память или нет.
Ответить | Правка | Наверх | Cообщить модератору

34. "Взлом Linux через подключение USB-устройства стал реальность..."  +3 +/
Сообщение от Аноним (-), 08-Мрт-11, 13:15 
> есть алгоритмы кодирования длины произвольной последовательности.

Это дополнительная сложность и время. Спорный оверхед, в общем. Может где-то и нужно, в большинстве применений - нет.

Ответить | Правка | Наверх | Cообщить модератору

192. "Взлом Linux через подключение USB-устройства стал реальность..."  +2 +/
Сообщение от Аноним (-), 08-Мрт-11, 23:17 
>> есть алгоритмы кодирования длины произвольной последовательности.
> Это дополнительная сложность и время. Спорный оверхед, в общем. Может где-то и
> нужно, в большинстве применений - нет.

а перераспределение памяти и поиск конца строки это не лишние ресурсы?

Ответить | Правка | Наверх | Cообщить модератору

54. "Взлом Linux через подключение USB-устройства стал реальность..."  +5 +/
Сообщение от cmp (ok), 08-Мрт-11, 14:26 
Проще разработать 1024битную архитектуру с sizeof(int) == 1024, запихать туда 2^1024 ОЗУ и не парится храня там ежесекундные снапшоты вселенной.
Ответить | Правка | К родителю #18 | Наверх | Cообщить модератору

209. "Взлом Linux через подключение USB-устройства стал реальность..."  –1 +/
Сообщение от User294 (ok), 09-Мрт-11, 03:09 
> Поле длины строки необязательно должно быть фиксированной длины — есть алгоритмы
> кодирования длины произвольной последовательности.

... только парсить долго :) а теперь представь что тебе придется рюхать миллион таких полей? А миллиард не хочешь? Не как тупо 1 регистровую операцию, как раньше, что быстро, а как целая уйма хитрых операций с регистрами и прочая, т.к. проц не умеет нативно работать с таким представлением.

Ответить | Правка | К родителю #18 | Наверх | Cообщить модератору

210. "Взлом Linux через подключение USB-устройства стал реальность..."  +2 +/
Сообщение от коксюзер (?), 09-Мрт-11, 03:30 
>> Поле длины строки необязательно должно быть фиксированной длины — есть алгоритмы
>> кодирования длины произвольной последовательности.
> ... только парсить долго :) а теперь представь что тебе придется рюхать

Что парсить? Как рюхать?

> миллион таких полей? А миллиард не хочешь? Не как тупо 1

Да чо уж там, берите сразу триллион - он в тыщу раз внушительнее миллиарда звучит.

> регистровую операцию, как раньше, что быстро, а как целая уйма хитрых
> операций с регистрами и прочая, т.к. проц не умеет нативно работать
> с таким представлением.

Так бы и написали: "Все это очень сложно и очень затратно. Правда-правда."

Ответить | Правка | Наверх | Cообщить модератору

215. "Взлом Linux через подключение USB-устройства стал реальность..."  –1 +/
Сообщение от User294 (ok), 09-Мрт-11, 05:27 
>> ... только парсить долго :) а теперь представь что тебе придется рюхать
> Что парсить? Как рюхать?

Я так понимаю что изен про кодирование интегеров с переменной длиной или типа того. Бывает такое, можно и правда закодировать интегер произвольного диапазона более компактно чем обычно. И такое кодирование часто попадается в транспортных протоколах двинутых на компактности любой ценой :). Расплатой за это обычно является некоторая геморность парсинга всего этого - на реконструкцию интегера из такой конструкции требуется несколько лишних операций. Одно дело погрузить в регистры проца число "как есть" и другое - пачка хитрых преобразований чтобы понять какой реально размер у variable-length integer и получить его в нормальном виде понятном процу. В итоге выигрывается в занимаемом числом месте (в байтах) - малые числа получаются короче. Но проигрывается в трудоемкости разбора этого представления.  

>> миллион таких полей? А миллиард не хочешь? Не как тупо 1
> Да чо уж там, берите сразу триллион - он в тыщу раз
> внушительнее миллиарда звучит.

А тут все просто: вы не заметите 10 микросекунд вместо 1. Зато вы легко заметите 10 часов вместо 1 часа. Хотя в обоих случаях разница в все те же 10 раз, совершенно одинаковые ;)

> Так бы и написали: "Все это очень сложно и очень затратно. Правда-правда."

Ну одно дело тупо затолкать число в регистры (в лучшем случае аж 1 команда проца будет), а другое varibale-length кодирование сперва расколупать для этого :). Как бы будет некоторая разница в числе команд которые потребны для одного и того же действа - некое число доступно теперь процу для обработки в виде который был изначально задуман :)

Ответить | Правка | Наверх | Cообщить модератору

220. "Взлом Linux через подключение USB-устройства стал реальность..."  +3 +/
Сообщение от коксюзер (?), 09-Мрт-11, 06:07 
> Я так понимаю что изен про кодирование интегеров с переменной длиной или
> типа того. Бывает такое, можно и правда закодировать интегер произвольного диапазона
> более компактно чем обычно. И такое кодирование часто попадается в транспортных
> протоколах двинутых на компактности любой ценой :). Расплатой за это обычно

Он вообще-то о строках, как я понял. В нормальных языках это происходит просто: вы параметризуете строковый тип максимальным размером строки, а компилятор выбирает, сколько байт под величину размера выделить. Не говоря о наличии возможности работать с нуль-терминированными строками и прочей ересью, если приспичило.

> А тут все просто: вы не заметите 10 микросекунд вместо 1. Зато
> вы легко заметите 10 часов вместо 1 часа. Хотя в обоих
> случаях разница в все те же 10 раз, совершенно одинаковые ;)

Это спекуляции о постороннем, но я таки замечу, что на современных суперскалярах всё не так очевидно, как в листинге ассемблера. Хотите узнать оверхед, надо профилировать, а не спекулировать.

Ответить | Правка | Наверх | Cообщить модератору

246. "Взлом Linux через подключение USB-устройства стал реальность..."  –1 +/
Сообщение от User294 (ok), 09-Мрт-11, 15:31 
> Он вообще-то о строках, как я понял.

Я так понял что он предлагал хранить длину строки как variable length integer?

> В нормальных языках это происходит просто: вы параметризуете строковый тип
> максимальным размером строки, а компилятор выбирает, сколько байт под
> величину размера выделить.

А при нужде интероперабельно с остальными слить это на диск в файл или передать по сети в *предсказуемом* виде, который потом ремота/другая программа сможет распарсить без привязки к языку, платформе, етц - мы жесточайше факаем мозг, делаем не слишком тривиальные преобразования и что там еще, в общем как обычно. Известное дело, ага. Не, ну можно конечно себе поднасрать на ровном месте, затребовав сложную сериализацию-десериализацию, но это похоже на создание себе проблем сначала, а потом героическую борьбу с ними. Нахрена бы? :)

> Не говоря о наличии возможности работать с нуль-терминированными строками
> и прочей ересью, если приспичило.

Ну, эта ересь как-то исторически прижилась, поэтому она есть. Если так придираться, UTF-8 с его переменным числом байтов на символ - тоже не подарок, только вот кодировать каждую букву как 32 или более битов ради того чтобы японцы/китайцы могли свои иерглифы пропихивать - жирновато будет, не? :)

> Это спекуляции о постороннем, но я таки замечу, что на современных суперскалярах
> всё не так очевидно, как в листинге ассемблера.

Ессно, зависит от, но в общем случае чем больше инструкций, обращений к памяти и прочая - тем дольше они выполняются. И чем жирнее код - тем меньше шансов что он целиком попадет в кеш и резко выиграет в скорости.

> Хотите узнать оверхед, надо профилировать, а не спекулировать.

Ну да, всякие там жабисты любят дрюкаться с профайлером: их софт вечно тормозит, поэтому они зеленеют в профайлерах намного больше чем сишники/сиплюсплюсники, я это заметил, ыгы :))). И главное почему-то никто не пишет критичные к скорости программы на этих ваших крутых и правильных языках. Почему-то игры, сжатие, шифрование, кодеки, ну 3D и прочая навернутая математика которую надо в реалтайме успевать - все как одно на сях или плюсах. Хотя казалось бы JIT дает кучу теоретических преимущесв и что там еще. Обычно умудряются эти преимущества легко похерить кучей рантайм проверок, излишне задрюканными сущностями типа "интегер - это объект" и прочими наворотами.

Ответить | Правка | Наверх | Cообщить модератору

261. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от iZEN (ok), 09-Мрт-11, 17:31 
>> Он вообще-то о строках, как я понял.
> Я так понял что он предлагал хранить длину строки как variable length integer?

Грубо говоря, я предложу такую структуру:
struct String {
   len_of_len; //длина поля длины в байтах
   len_of_data;//поле длины строки в символах
   data;//ссылка на контейнер данных перечислимого типа [1...len_of_data]
}

Плюсы такой структуры:
+ независимость структуры от базовых типов short, int, long, ограничивающих длину строки и отсутствие избыточности служебной информации для коротких строк;
+ элементы данных строки счётны от 1 до len_of_data без нужны вычислять конец строки и идиотского "нулевого элемента", принятого в C для элементов массива (по-мне, так символы в строке — это не массив!);
+ контейнер данных может поддерживать любой доступ к элементам строки (хранить разреженные строки, например), но перечислимость [1...len_of_data] элементов должен обеспечивать — это даёт нам гибкость в абстрагировании от конкретной реализации контейнера.

Ответить | Правка | Наверх | Cообщить модератору

264. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от коксюзер (?), 09-Мрт-11, 17:52 
>> Он вообще-то о строках, как я понял.
> Я так понял что он предлагал хранить длину строки как variable length
> integer?
>> В нормальных языках это происходит просто: вы параметризуете строковый тип
>> максимальным размером строки, а компилятор выбирает, сколько байт под
>> величину размера выделить.
> А при нужде интероперабельно с остальными слить это на диск в файл

Трололо, придумаем проблему и выделим ей абзац в нашей простыне.

> или передать по сети в *предсказуемом* виде, который потом ремота/другая программа

Ха, данные по сети всегда передаются с таким оверхедом по заголовкам, что сравнивать его с 32/64-битной величиной длины строки - вообще срам. ;)

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

Это всё чушь. Поточная сущность ввода-вывода позволяет подставить любые заголовки до или после строк. Хоть терминировать '\0', хоть записать размер в беззнаковое целое - как угодно. А уж вес этих операций делает любые разговоры об оверхеде на пару-тройку операций с двойным словом просто неприличными. Это всё троллинг. iZEN вообще всех затроллил - начал тред и сел смотреть на массакр. :)

> в общем как обычно. Известное дело, ага. Не, ну можно конечно

Угу, да. Не, ну конечно же можно.

> себе поднасрать на ровном месте, затребовав сложную сериализацию-десериализацию, но это
> похоже на создание себе проблем сначала, а потом героическую борьбу с
> ними. Нахрена бы? :)

Вот именно, нахрена бы?

> Ну, эта ересь как-то исторически прижилась, поэтому она есть. Если так придираться,

Вы уже определитесь, вам ASCIIZ-строки не нравятся или их альтернативы? ;)

> UTF-8 с его переменным числом байтов на символ - тоже не

Вот уж где оверхед, так это парсинг не-ASCII текста в UTF-8! Правда, даже этот оверхед в большинстве случаев ничего не решает, и мы тут просто троллим порожняком.

> подарок, только вот кодировать каждую букву как 32 или более битов

Кодировать! О, кошмар! О, ужас!!!1 Бегом переходить на UTF-8 за полчаса - уж там-то, наверное, кодирования нет. ;)

> ради того чтобы японцы/китайцы могли свои иерглифы пропихивать - жирновато будет,
> не? :)

Гы. Лол.

>> Это спекуляции о постороннем, но я таки замечу, что на современных суперскалярах
>> всё не так очевидно, как в листинге ассемблера.
> Ессно, зависит от, но в общем случае чем больше инструкций, обращений к

Тролололо в общем случае.

> памяти и прочая - тем дольше они выполняются. И чем жирнее
> код - тем меньше шансов что он целиком попадет в кеш
> и резко выиграет в скорости.

И чем дольше, тем жирнее, ага. ;)

> Ну да, всякие там жабисты любят дрюкаться с профайлером: их софт вечно
> тормозит, поэтому они зеленеют в профайлерах намного больше чем сишники/сиплюсплюсники,
> я это заметил, ыгы :))). И главное почему-то никто не пишет
> критичные к скорости программы на этих ваших крутых и правильных языках.

Потому что пока правильные языки проектировались с учётом требований и обязывали производителей компиляторов к стандартизации для применения торговых марок-названий языка, академическое сообщество весело и задорно клепало экосистему Си-подобных языков, включая ОС, и её апологетов, привлекая внимание индустрии к тому, что уже освоено и "is just good enough".

> Почему-то игры, сжатие, шифрование, кодеки, ну 3D и прочая навернутая математика
> которую надо в реалтайме успевать - все как одно на сях

На ассемблере.

> или плюсах. Хотя казалось бы JIT дает кучу теоретических преимущесв и

Или фортране. Алсо, спидфаг детектед.

> что там еще. Обычно умудряются эти преимущества легко похерить кучей рантайм
> проверок, излишне задрюканными сущностями типа "интегер - это объект" и прочими
> наворотами.

Потому что спидфаги нихрена не целевая аудитория мелких транснациональных конторок, которые клепают эти платформы. Что в позе неуловимых Джо позволяет первым прокачать ЧСВ и набухнуть от чувства сопричастности с Самым Быстрым Языком (нужный подчеркнуть).

Ответить | Правка | К родителю #246 | Наверх | Cообщить модератору

268. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от Dvorkinemail (??), 09-Мрт-11, 18:43 
> Потому что спидфаги нихрена не целевая аудитория мелких транснациональных конторок,
> которые клепают эти платформы. Что в позе неуловимых Джо позволяет первым прокачать ЧСВ > и набухнуть от чувства сопричастности с Самым Быстрым Языком (нужный подчеркнуть).

я бы посмотрел, как мир бы тужился с виндоус и линукс на джаве или питоне,
спидфаги, говоришь, хреновы?

Ответить | Правка | Наверх | Cообщить модератору

270. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от коксюзер (?), 09-Мрт-11, 18:54 
>> Потому что спидфаги нихрена не целевая аудитория мелких транснациональных конторок,
>> которые клепают эти платформы. Что в позе неуловимых Джо позволяет первым прокачать ЧСВ > и набухнуть от чувства сопричастности с Самым Быстрым Языком (нужный подчеркнуть).
> я бы посмотрел, как мир бы тужился с виндоус и линукс на
> джаве или питоне,
> спидфаги, говоришь, хреновы?

Когда я пишу "другие низкоуровневые языки", обвиняют в отсутствии конкретики, когда пишут "Ада", переводят разговор на джавы и питоны. Что за жизинь, э! ;)

Ответить | Правка | Наверх | Cообщить модератору

19. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от caps (?), 08-Мрт-11, 12:40 
Удивительно, но в ядре "вражеской" системы от МС этот тип строк используется повсеместно. Наверняка там работают тупые придурки, которые  для безопасности пространства ядра бездарно тратят целых 2 байта на строку. (там для длины строки используется word тип)
Ответить | Правка | К родителю #13 | Наверх | Cообщить модератору

103. "Взлом Linux через подключение USB-устройства стал реальность..."  +8 +/
Сообщение от test (??), 08-Мрт-11, 17:10 
Ну и как, сильно безопасное получилось?
Ответить | Правка | Наверх | Cообщить модератору

104. "Взлом Linux через подключение USB-устройства стал реальность..."  +1 +/
Сообщение от коксюзер (?), 08-Мрт-11, 17:14 
> Ну и как, сильно безопасное получилось?

Несильно, ибо строки не единственная и даже не самая серьёзная проблема си.

Ответить | Правка | Наверх | Cообщить модератору

216. "Взлом Linux через подключение USB-устройства стал реальность..."  +2 +/
Сообщение от User294 (ok), 09-Мрт-11, 05:36 
> Несильно, ибо строки не единственная и даже не самая серьёзная проблема си.

Да уж. Индусы успешно доказывают что обделаться с критичными последствиями можно и на яве, питоне, пхп, [insert your favorite language here]. Ну не переполнение буфера так ремот инклюд, sql иньекция, XSS, CSRF ... - вам как, сильно полегчало? Ну упрет хацкер 100500 аккаунтов от гмыльников, фэйсовконтактов и прочая и вообще базу похерит/изменит, наприер - не факт что это нанесет меньше ущерба чем какое-то там переполнение буфера. В конечном итоге хакерье нынче давно уже не интересует возможность выполнить код ради возможности выполнить код. Это их интересует чтобы поиметь профит или данные пользователей. И возможность с дикими извращениями при физическом доступе к машине поиметь доступ к 1 машине - далеко не самая страшная дырень в свете таких реалий. Куда моднее массовое, ремотное поимение, bulk-рассылка спама, массовой кражи конфиденциальных и ценных данных, при том первое как правило нужно в основном для второго и третьего. Самое странное в этом то что дыры в сишном коде при работе с сетью встречаются весьма редко - дыр в web-приложениях например почему-то в 100500 раз больше оказывается. Хотя, казалось бы, переполнений буферов нет, стек хрен сорвешь, ну что еще этим ... не хватает для безопасного написания программ?!

Ответить | Правка | Наверх | Cообщить модератору

61. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от Sw00p aka Jerom (?), 08-Мрт-11, 14:52 
> Т.е. хранить 32 байта с длинной строки, когда сама строка занимает один
> байт это нормально?

блин - проверка должна быт ьи в функцию должна передаваться длина строки

Ответить | Правка | К родителю #13 | Наверх | Cообщить модератору

79. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от коксюзер (?), 08-Мрт-11, 16:16 
> блин - проверка должна быт ьи в функцию должна передаваться длина строки

Конечно должна. Это же какой контроль!

Ответить | Правка | Наверх | Cообщить модератору

77. "Взлом Linux через подключение USB-устройства стал реальность..."  +5 +/
Сообщение от коксюзер (?), 08-Мрт-11, 16:14 
> Т.е. хранить 32 байта с длинной строки, когда сама строка занимает один
> байт это нормально?

Ненормально - путать биты с байтами и забывать о возможности параметризации типов.

Ответить | Правка | К родителю #13 | Наверх | Cообщить модератору

69. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от Аноним (-), 08-Мрт-11, 15:41 
> Ок, для успешной индексации строк с over 2 млрд. символов всегда надо будет хранить лишних 4 байта, для любой строки, удачи !

А тебе успешного выяснения длинны строки. Жди когда найдет заветный байт в 2хгиговом куске данных

Ответить | Правка | К родителю #9 | Наверх | Cообщить модератору

247. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от User294 (ok), 09-Мрт-11, 15:38 
> А тебе успешного выяснения длинны строки. Жди когда найдет заветный байт в
> 2хгиговом куске данных

А в чем принципиальная разница по скорости: проверять ли байт на то что он равен нулю, и если да - то забить, или проверять что счетчик байтов дотикал до нужного значения, и если равен - то забить? С точки зрения трансформации в машинный код - получится примерно одинаково. С точки зрения попадания в кещ - по идее  в него не попадет только 2Гб данных, остальное уместится даже в самый мизерный в кеш. Я что-то упустил и в каком-то месте наступает зверский профит?

Ответить | Правка | Наверх | Cообщить модератору

251. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от Аноним (-), 09-Мрт-11, 16:31 
В некоторых алгоритмах желательно иметь длину строки заранее, например, для склеивания двух строк должна быть известна длина первой, т.е. имеем бесполезное пробегание циклом по строке. В результате, если надо склеить 10 строк по 10 символов, получаем 10*(1+2+...+9) = 450 чтений символов. Для 100-символьной строки замедление в 6 раз, круто? )
Ответить | Правка | Наверх | Cообщить модератору

262. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от User294 (ok), 09-Мрт-11, 17:39 
> В некоторых алгоритмах желательно иметь длину строки заранее, например, для склеивания
> двух строк должна быть известна длина первой,

Это только в том (относительное редком) случае, если destination совпадает с первой строкой, там есть достаточно места куда можно отрастить результат и допустимо менять содержимое. Хотя черт с вами, уговорили, можно таскать счетчик отдельно и иногда это и правда будет эффективнее. А какая проблема сделать это на си если такая задача есть и ее скорость критична? :) А то что все и вся не пихают по дефолту - ну так если впихать все и вся по принципу "а вдруг пригодится?!" - получится еще одна ява, где можно уснуть пока hello world стартанет...

Ответить | Правка | Наверх | Cообщить модератору

263. "Взлом Linux через подключение USB-устройства стал реальность..."  +1 +/
Сообщение от iZEN (ok), 09-Мрт-11, 17:43 
>> В некоторых алгоритмах желательно иметь длину строки заранее, например, для склеивания
>> двух строк должна быть известна длина первой,
> Это только в том (относительное редком) случае, если destination совпадает с первой
> строкой, там есть достаточно места куда можно отрастить результат и допустимо
> менять содержимое. Хотя черт с вами, уговорили, можно таскать счетчик отдельно
> и иногда это и правда будет эффективнее. А какая проблема сделать
> это на си если такая задача есть и ее скорость критична?

Проблема в том, что в сях оно будет не на уровне компилятора, а где-то "сбоку" в левой библиотечке, о которой многие разработчики будут не в курсе, и будут писать собственные велосипедики, несовместимые с ней.

Ответить | Правка | Наверх | Cообщить модератору

266. "Взлом Linux через подключение USB-устройства стал реальность..."  +1 +/
Сообщение от коксюзер (?), 09-Мрт-11, 18:15 
>> В некоторых алгоритмах желательно иметь длину строки заранее, например, для склеивания
>> двух строк должна быть известна длина первой,
> Это только в том (относительное редком) случае, если destination совпадает с первой
> строкой, там есть достаточно места куда можно отрастить результат и допустимо

А если не совпадает, длину обеих строк не обязательно знать для выделения буфера под результат, ага-ага. ;)

> менять содержимое. Хотя черт с вами, уговорили, можно таскать счетчик отдельно
> и иногда это и правда будет эффективнее. А какая проблема сделать
> это на си если такая задача есть и ее скорость критична?

Проблема не в том, чтобы сделать это на Тюринг-полном языке, а в том, что что решение получится относительно неудобным. Можно вообще проставить вопрос, зачем Си если есть лисп, фортран и ассемблер?

> :) А то что все и вся не пихают по дефолту
> - ну так если впихать все и вся по принципу "а
> вдруг пригодится?!" - получится еще одна ява, где можно уснуть пока
> hello world стартанет...

Закупайте Фейри в цистернах. :Р

Ответить | Правка | К родителю #262 | Наверх | Cообщить модератору

274. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от Аноним (-), 09-Мрт-11, 19:42 
> А если не совпадает, длину обеих строк не обязательно знать для выделения буфера под результат, ага-ага. ;)

А если не совпадает, обе строки пробегаются в любом случае, и разницы по времени никакой, что со счетчиком, что без.
Другое дело, что это далеко не каждый случай. В том же примере со строками 10х10 очень накладно будет перебрасывать строки между буферами туда-сюда, выделять память каждый раз, это же страшно медленно, лучше заранее выделить буфер с запасом. Существует рекомендация выделять память блоками по 2^N байт, это здорово сокращает фрагментацию и количество выделений-освобождений, при этом прога сжирает максимум вдвое больше памяти, чем ей реально нужно.

> Проблема не в том, чтобы сделать это на Тюринг-полном языке, а в том, что что решение получится относительно неудобным. Можно вообще проставить вопрос, зачем Си если есть лисп, фортран и ассемблер?

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

Ответить | Правка | Наверх | Cообщить модератору

277. "Взлом Linux через подключение USB-устройства стал реальность..."  +1 +/
Сообщение от paxuser (ok), 09-Мрт-11, 20:05 
> А если не совпадает, обе строки пробегаются в любом случае, и разницы
> по времени никакой, что со счетчиком, что без.

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

> Другое дело, что это далеко не каждый случай. В том же примере
> со строками 10х10 очень накладно будет перебрасывать строки между буферами туда-сюда,

Обсуждение абстрактных алгоритмов класса "туда-сюда" вносит конструктив и способствует взаимопониманию.

> выделять память каждый раз, это же страшно медленно, лучше заранее выделить
> буфер с запасом. Существует рекомендация выделять память блоками по 2^N байт,
> это здорово сокращает фрагментацию и количество выделений-освобождений, при этом прога
> сжирает максимум вдвое больше памяти, чем ей реально нужно.

Я так понял, когда та же джава разом выделяет память под кучу, сишники тычат в неё пальцами и сравнивают такой расход памяти с утечками. А прижмешь их на предмет эффективной работы со строками, начинают рассказывать о преаллокации и оверхеде "максимум вдвое больше". Очень показательно.

Наверное, если спросить про сериализацию строк с предварительным указанием размера в заголовках (тот же HTTP), они будут рассказывать о хранении длины в структурах и массивах. Ведь это же так медленно, пересчитывать её каждый раз! Поэтому в Си всё быстро, и контроль полный (ну ведь можно же хранить в структурах, кто не даёт-то?). То ли дело в других языках - всё джавой накрылось и дотнет полный.

> Стандарт скоро не перепишешь, а отдельно взятый компилер (GCC) - запросто. В
> настройках компиляции переключатель типов строк по умолчанию, и строковая библиотека в
> двух вариантах.

Дооо, нужно просто допилить GCC, добавить строковый тип (который не нужен, ведь оверхед максимум вдвое больше!), и всё пучком. Других проблем нет.

Ответить | Правка | Наверх | Cообщить модератору

281. "Взлом Linux через подключение USB-устройства стал реальность..."  +/
Сообщение от фыв (??), 09-Мрт-11, 23:17 
> Не в любом случае, а в ряде случаев. В любом случае как раз нужно знать длину каждой строки ("пробежаться" по обеим один раз), выделить буфер размером с обе и "пробежаться" по

строкам второй раз, при копировании.

strcat не выделяет память. И я вроде уже писал, что выделять каждый раз память зело накладно, особенно если заранее известна предельная длина результата.

> Обсуждение абстрактных алгоритмов класса "туда-сюда" вносит конструктив и способствует взаимопониманию.

См выше. Попробуйте представить, что будет в том примере 10х10, если каждый раз под результат будет выделяться память, и оцените быстродействие. Помимо указанной задержки в 6 раз на лишнее копирование/пробегание будет задержка при выделении огрызков 10, 20, ..., 90, 100 байт, которые по окончании операции станут не нужны и освободятся, отлично фрагментировав память. Неужели не проще выделить буфер на 100 байт _один раз_ и работать с ним?

> Я так понял, когда та же джава разом выделяет память под кучу, сишники тычат в неё пальцами и сравнивают такой расход памяти с утечками. А прижмешь их на предмет эффективной работы со строками, начинают рассказывать о преаллокации и оверхеде "максимум вдвое больше". Очень показательно.

Это вы сами с собой разговариваете? Красиво у вас там все, должно быть, черт побери

> Дооо, нужно просто допилить GCC, добавить строковый тип (который не нужен, ведь оверхед максимум вдвое больше!), и всё пучком. Других проблем нет.

Вас сишники в магазине что ли обвешали? Или в детстве отнимали деньги на обеды?

Ответить | Правка | Наверх | Cообщить модератору

285. "Взлом Linux через подключение USB-устройства стал реальность..."  +1 +/
Сообщение от paxuser (ok), 10-Мрт-11, 04:31 
> strcat не выделяет память. И я вроде уже писал, что выделять каждый

Ещё бы выделял. Всё руками.

> раз память зело накладно, особенно если заранее известна предельная длина результата.

Накладно, но всегда возможно или допустимо, в отличие от преаллокации по оценке сверху. И давайте без strcat как-то уже. Или проверку на выход за границы буфера в общем случае тоже можно не делать? :) Алсо, с вами скучно троллить.

> выделить буфер на 100 байт _один раз_ и работать с ним?

В этом случае проще. А когда нужно дать отлуп пользователю (источнику входных данных), если результат не вместится в буфер? Предложите начать копировать, а ошибку вернуть в случае заполнения буфера? Нет, вы спросите, что мешает пользователю передать размер строки вместе со строкой (как собственно и происходит чаще всего). То есть, предложите так или иначе пробросить передачу размера по всей цепочке вызовов. Мол, пользователь знает длину строки, поскольку он её откуда-то получил, вот пусть и передаст. И вроде бы проблема решена, но традиционно для Си - нагибая пользователей API. А если API чего-то не предусматривает (плохие проектировщики изначально сделали его простым) - это не проблема языка. Ведь так?

И потом, конкатенация - частный случай. Как думаете, сложно найти задачу по эффективной работе со строками, для которой придётся переизобрести строки с хранимой длиной? С подстроками у си как? Ах, ну да: изобретаем свой структурный тип (не совместимый с нуль-терминацией и стандартными функциями), и всё замечательно. Полный контроль. И не рассказывайте мне, что таких задач нет - есть, решал пару месяцев назад и плевался.

> Это вы сами с собой разговариваете? Красиво у вас там все, должно
> быть, черт побери

Это я рассуждаю вслух. Вам, вот, повод поёрничать дал. А вы продолжайте, не стесняйтесь - ваши догадки о причинах моей нелюбви к Си весьма любопытны.

> Вас сишники в магазине что ли обвешали? Или в детстве отнимали деньги
> на обеды?

Ну конечно же дело во мне. Придумал проблемы, которых нет.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру