?

Log in

No account? Create an account

Проклятье процедурного программирования - Ваши рубидии уже у кобальта во ртути

Aug. 28th, 2012

04:25 pm - Проклятье процедурного программирования

Previous Entry Share Next Entry



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

Если формировать объект типа std::string посимвольно, то память будет выделяться и копироваться кусками размером 1, 2, 4, 8 и т.п. символов, что хоть асимптотически и линейно, корысти в этом мало.

Впрочем, партия об этом подумала уже давно, и в классе-шаблоне std::basic_string отродясь есть метод reserve(size_type size) - причем это единственный способ управить размером памяти для каждого объекта каждый раз явно; до введения в шаблон дополнительного параметра min_alloc со значением по умолчанию, равным 1 (и с полезным на нашей практике значением порядка сотни-двух), эти архимеды, начиная то ли со Степанова, то ли со Страуструпа, не дотумкали.

Но ладно уж это! Убило меня то, что этот несчастный метод возвращает void даже в С++11!
Т.е. еще лет 10, чтобы было эффективно, нам придется писать не как людям,
return std::string().reserve(много).assign(нечто).append(кое-что);
а как на фортране полвека назад, с переменнымя. Или изобретать собственные классы-велосипеды.

Ну тупы-ы-ы-ые! И этим людям мы доверяем придумывать языки для heavy industrial usage?

Comments:

(Deleted comment)
[User Picture]
From:spamsink
Date:August 28th, 2012 11:58 pm (UTC)
(Link)
И что бы это значило? Какой смысл кастить объект только что из конструктора к тому же типу? Остальное, IMO, вообще за пределами добра, зла и синтаксиса языка.
(Reply) (Parent) (Thread)
[User Picture]
From:fatoff
Date:August 28th, 2012 11:49 pm (UTC)
(Link)
You are so full of wisdom. I personally easily ignore all these imperfections by enjoying other definitely beautiful things in C++ 11 such as move semantics.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:August 28th, 2012 11:56 pm (UTC)
(Link)
...by enjoying other definitely beautiful things in C++ 11

Я пока только облизываюсь. To the point, these particular imperfections leave an impression of shoddiness.
(Reply) (Parent) (Thread)
[User Picture]
From:ormuz
Date:August 29th, 2012 02:59 am (UTC)
(Link)
Насколько я помню, в gcc stl строки были вовсе не такие простые, с copy-on-write семантикой и с нетривиальными оптимизациями
в том смысле, что reserve не может вернуть ничего путного, потому как ничего путного и не делает.
(Reply) (Thread)
[User Picture]
From:ormuz
Date:August 29th, 2012 03:20 am (UTC)
(Link)
Посмотрел - зря вы
оно хитрое (_S_create), всегда страничку (4096) заранее аллоцирует - то есть то что вы хотите, вы на самом деле не хотите.
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:spamsink
Date:August 29th, 2012 03:31 am (UTC)
(Link)
От любого метода не убудет, если вместо void он вернет *this.

(Reply) (Parent) (Thread)
[User Picture]
From:ak_47
Date:August 29th, 2012 04:59 am (UTC)
(Link)
Обычно в имплементации std::string используется small string optimization, так что большинство юзеров благодарны уже и так. Далее, изменение готового стринга операция значительно более редкая, чем единоразовое создание стринга, который не меняется за свою жизнь. У вас задача несколько отличается от мейнстримной: во-первых, стринги подлинее будут; во-вторых, часто меняются. Вот для таких и сделали возможность подставить свой аллокатор и вытворять с памятью что угодно. Остальным 99% это всё не надо. И даже если раз в жизни надо, то перформанс ни разу не критичен.

Код вида return std::string().reserve(много).assign(нечто).append(кое-что); пишут далеко не все люди. Я считаю это весьма
некрасивым проявлением джаваизма, который, к сожалению, пролез в другие языки. Произошло это, в основном, благодаря двум факторам: а) понижение квалификации занятых в отрасли и б) появление auto completion в редакторах. Поэтому такую колбасу клепать стало легко и быстро. А в Индии время на код тратить не любят.

Я как раз имею тенденцию заводить переменные (как в Фортране, ага), потому что не только читабельность повышается, но и в дебаггере их легко видеть. А не надо выковыривать из регистров временные инстансы.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:August 29th, 2012 07:44 am (UTC)
(Link)
Обычно в имплементации std::string используется small string optimization

Обычно - это где? И что такое small? 8 - маловато будет.

Далее, изменение готового стринга операция значительно более редкая, чем единоразовое создание стринга, который не меняется за свою жизнь.

Откуда это известно?

подставить свой аллокатор и вытворять с памятью что угодно

Не что угодно. У std::allocator нет метода realloc, поэтому он не в состоянии прозрачно реализовать функциональность min_alloc. Если бы такой метод был, я бы им воспользовался.

И даже если раз в жизни надо, то перформанс ни разу не критичен.

Для разработчиков стандарта индустриального языка общего назначения такие рассуждения неприемлемы.

Я считаю это весьма некрасивым проявлением джаваизма

А я - красивым проявлением аппликативного программирования. Прелесть языков высокого уровня в том, что отлаживать приходится всё меньше и меньше.

А в Индии время на код тратить не любят.

Да, поэтому пишут спагетти-код из сотни строк с массой переменных, циклов, присваиваний и прочей лабуды, и потом много часов отлаживают off-by-one errors, вместо того, чтобы подумать 5-10 минут и написать полдюжины строк с полным пониманием происходящего, делающих ровно то же самое безошибочно by construction.


(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:lider
Date:August 29th, 2012 06:19 pm (UTC)
(Link)
" для heavy industrial usage"

И пусть никоґда ґлаз не устанет смотреть на чужую тяжелую работу!!!
(Reply) (Thread)
[User Picture]
From:spamsink
Date:August 29th, 2012 06:22 pm (UTC)
(Link)
Да пожалуйста, пожалуйста - будучи подсажены на плоды этой чужой тяжелой работы, как на наркотик, мало того, что глаз не устанет смотреть, так еще и рука не устанет лазить в карман за деньгами.
(Reply) (Parent) (Thread)
[User Picture]
From:_navi_
Date:August 30th, 2012 06:24 am (UTC)
(Link)
Если ты такой у-у-умный, то почему памятник Пушкину ты до сих пор не в комитете? (Я на самом деле только наполовину шучу, я очень согласен с твоими взглядами на C++ :-) )
(Reply) (Thread)
[User Picture]
From:spamsink
Date:August 30th, 2012 06:45 am (UTC)
(Link)
Кто б меня туда взял?

Что-то я гуглением полного списка живых людей-членов комитета не найду, а из first-billed никого лично не знаю. Может, в полном списке кто из моих знакомых есть и лоббирования хватит?
(Reply) (Parent) (Thread) (Expand)
[User Picture]
From:e2pii1
Date:September 9th, 2012 06:46 am (UTC)
(Link)
<<
до введения в шаблон дополнительного параметра min_alloc со значением по умолчанию, равным 1 (и с полезным на нашей практике значением порядка сотни-двух), эти архимеды, начиная то ли со Степанова, то ли со Страуструпа, не дотумкали
>>

Это они сознательно не сделали: цель стандартной библиотеки - минимально-достаточная базовая функциональность, а не "все что угодно что может кому-то понадобиться". Это Страуструп в своей книге объясняет (и это смысленно чтоб библиотека имела обозримый размер). Делайте свой класс полезный в вашей практике.

А с reserve() возвращающим ссылку на объект Вы совершенно правы, это бы им стоило сделать.
(Reply) (Thread)
[User Picture]
From:spamsink
Date:September 9th, 2012 06:53 am (UTC)
(Link)
Делайте свой класс полезный в вашей практике.

Т.е. буквально "копируйте существующее стандартное решение и добавляйте к нему две строки, потому что кто-то когда-то решил быть чистоплюем". Это я считаю свинством.

(Reply) (Parent) (Thread) (Expand)