|
|
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
В ногу со временем, переходя от ассемблера к C++, дивишься, как проста эта гениальность. Почему бы не описывать задачу простым человеческим языком, опираясь, как в повседневном быту, на отношения объектов, не вникая в бинарную жизнь регистров. А дальше пусть потеет компилятор, лишь бы работало. Но некторым людям, любившим в ассемблерные времена показать миру, как своим мозгом они способны экстремально оптимизировать алгоритм, теперь только гадают, во что выльется скормленное компилятору волосатое выражение на ЯВО. Конечно, нужно учитывать цели - блестнуть на хакерской битве или отожрать кусок рынка производителей ПО. Но бывает так: суббота, вечер, чай, программирование для души. Куда понесёт - хз. Сперва и цели туманны. Искусство. Ограничений нет. Хочешь сделать свой продукт хорошим со всех сторон - расширяемым, споря с современными технологиями, приятный пользователю, реактивный и лёгкий, да чтобы исходники читались легко. И сроков нет. Моя ситуация такова. Пытаюсь изучать С++, треды, линукс-среду. С++ позволяет думать и объектами и ассемблером в одном исходнике. При желании можно забыть слова "указатель" и "байт". Но ведь понятно, что все твои красивые объекты с длинной родословной будут цинично скомпилированы в процессорный корм и структуры из вполне восьмибитовых байт. Короче, хотелось бы поизучать тему "С++ изнутри". Как реализована STL, операторы new, delete и пр. Это чтобы в моменты сомнений решать - смогу ли я сделать лучше, чем сделано в std::vector, например. Или реализовывать ли свой диспетчер памяти или написать new? К примеру, у меня была задача накопления текстовых строк. Один тред накапливал, второй в них рылся. Я применил vector. В один прекрасный момент возникала ситуация, когда роющийся тред находил какую-то строку, запоминал на неё указатель и топал дальше с намерением её прочитать ещё раз. В это время его выполнение прерывалось другим тредом, который выполнял в очередной раз добавление в вектор новой строки. Но в этот раз вектор решал перераспределить себе память и перемещал всего себя в другое место в памяти. Когда управление передавалось на роющийся тред, то оказывалось, что в руках у него не указатель на строку, а указатель возможно уже в чужую память. Дальше этот тред "читал строку" и ОС зарубала процесс топором. Получается, у меня образовалась критическая секция, которую нужно обложить мьютексами. А ведь я мог заюзать связанный список и для каждой новой строки вызывать new. Строка добавлялась бы всегда за одинаковое время и никакой критической секции бы не было. Ничего бы не перемещалось, а расло бы как дерево. Вот видите, нужно помнить, что высокоабстрактный вектор таки хранится в физической памяти. Ни в каком Java или Python я бы так не накололся. В общем, посоветуйте, куда податься, что читать о том, из каких шурупов состоят высокие материи языка С++. Спасибо. Icq 297566544, Peorg@Jabber.org ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2007, 03:03 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
pavelkolodin wrote: > "С++ изнутри". Как реализована STL, операторы new, delete и пр. Можно банально почитать исходники. Как в MSVC так и в GCC. > В один прекрасный момент возникала ситуация, когда роющийся тред > находил какую-то строку, запоминал на неё указатель и топал дальше с > намерением её прочитать ещё раз. В это время его... Вот чтобы этого не происходило, в векторе надо было хранить не строку, а указатель на неё. Лучший вариант был бы сделать потомка от вектора или свой класс... Или же в векторе можно было хранить "смарт-поинтер" - смотря кому что ближе. По этому поводу в MSVC2005 в справке упоминается безопасность каждого STL-класса для многопоточных приложений. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2007, 03:49 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
ErV пишет: > Вот чтобы этого не происходило, в векторе надо было хранить не строку, а > указатель на неё. Лучший вариант был бы сделать потомка от вектора или свой > класс... Или же в векторе можно было хранить "смарт-поинтер" - смотря кому > что ближе. Для этого не надо хранить указатели в векторе (хранение в векторе по ссылке - тот еще гемор) Для этого надо синхронизировать правильно доступ к вектору. > По этому поводу в MSVC2005 в справке упоминается безопасность каждого > STL-класса для многопоточных приложений. Безопасность-то безопасностью, но синхронизировать все равно надо. Этого сам STL не делает. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2007, 08:24 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
Прежде чем улучшать STL, надо бы его поизучать. А именно, накупить книжекм по STL и позаглядывать в них глазами. В частности, этот вопрос объяснён в книже: Скотт Мейерс. Эффективное использование STL. глава 1, пункт 12,"Разумно оценивайте потоковую безопасность STL". Кстати, в Java входящие в JDK контейнеры тоже не все синхронизированы, поэтому тоже надо "разумно оценивать" их потоковую безопасность. Правда, их поведение не зависит от реализации библиотеки, как в STL, но всё равно литературу читать надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2007, 14:39 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
pavelkolodin Моя ситуация такова. Пытаюсь изучать С++, треды, линукс-среду. С++ позволяет думать и объектами и ассемблером в одном исходнике. При желании можно забыть слова "указатель" и "байт". Но ведь понятно, что все твои красивые объекты с длинной родословной будут цинично скомпилированы в процессорный корм и структуры из вполне восьмибитовых байт. Желание скрестить ежа с ужем в результате дает 3 метра колючей проволоки... pavelkolodin Короче, хотелось бы поизучать тему "С++ изнутри". Как реализована STL, операторы new, delete и пр. Это чтобы в моменты сомнений решать - смогу ли я сделать лучше, чем сделано в std::vector, например. Или реализовывать ли свой диспетчер памяти или написать new? Интересное желание, однако я думаю слабо выполнимое(судя о тому что написано ниже). Можно конечно отдельно взятый контейнер сделать немножко лучше, однако при этом пострадает остальная часть концепции. Ведь STL это не только контейнеры, но и итераторы, алгоритмы, функторы. Причем все это довольно тесно связано. pavelkolodin К примеру, у меня была задача накопления текстовых строк. Один тред накапливал, второй в них рылся. Я применил vector. В один прекрасный момент возникала ситуация, когда роющийся тред находил какую-то строку, запоминал на неё указатель и топал дальше с намерением её прочитать ещё раз. В это время его выполнение прерывалось другим тредом, который выполнял в очередной раз добавление в вектор новой строки. Но в этот раз вектор решал перераспределить себе память и перемещал всего себя в другое место в памяти. Когда управление передавалось на роющийся тред, то оказывалось, что в руках у него не указатель на строку, а указатель возможно уже в чужую память. Дальше этот тред "читал строку" и ОС зарубала процесс топором. Получается, у меня образовалась критическая секция, которую нужно обложить мьютексами. А эта проблема никоим образом не связана с потоками. Любая операция вставки в вектор и дэк может инвалидировать запомненный ранее итератор (читай указатель)... , что написано в доках. И никакой мъютекс тут не поможет pavelkolodin А ведь я мог заюзать связанный список и для каждой новой строки вызывать new. Строка добавлялась бы всегда за одинаковое время и никакой критической секции бы не было. Ничего бы не перемещалось, а расло бы как дерево. Вот видите, нужно помнить, что высокоабстрактный вектор таки хранится в физической памяти. Ни в каком Java или Python я бы так не накололся. В общем, посоветуйте, куда податься, что читать о том, из каких шурупов состоят высокие материи языка С++. Спасибо. Icq 297566544, Peorg@Jabber.org Не факт что в Жабе получив iterator и выполнив множество операций вставки в контейнер вы не получили бы исключение. На самом деле в C++ с мей точки зрения наиболее четко определены свойства контейнеров и итераторов по ним. Например для вектора гарантируется постоянное время доступа к элементу по индексу. Что же касается книжек 1 Бъерн Страуструп Язык программирования С++ Специальное излание 2 Николай Джосьтис С++ стандартная библиотека Tutorial & Reference 3 Уже упомянутый Скотт Мейерс Эффективный STL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.05.2007, 19:30 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
pavelkolodin... Написать лучше можно пробовать, но скорее всего, у вас получиться более специализированная библиотека. Изучать STL изнутри, значит два этапа: 1) Изучение снаружи. 2) Изучение исходников. И тем более не стоит забывать, что стандарт stl не дает четких правил реализации (некоторые только следуют из идеологии реализуемых объектов). Поэтому, изучив одну версию stl, еще не значит, что в других версиях нет других идей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2007, 09:54 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
Привет. Хочу поделиться мыслями. Профессионально с++ я не занимаюсь. Но тем не менее моя любимая компьютерная книга - А. Александреску - Современное проектирование на с++. Советую читать её всем, кто занимается программированием. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2007, 21:41 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2007, 21:46 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
Нахрен вам нужен С++. Сейчас C# "в моде". В C# вы точно забудете про прямую работу с "железом". И даже оператор delete Вам будет не нужен. С++ надо было учить лет пять назад, а сейчас C# рулит !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.05.2007, 16:42 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
TelepatНахрен вам нужен С++. Сейчас C# "в моде". В C# вы точно забудете про прямую работу с "железом". И даже оператор delete Вам будет не нужен. С++ надо было учить лет пять назад, а сейчас C# рулит !!! когда был васик ппулярен, потом жаба. А все приложения как писались на С++ та и будут писаться. Тем более что для извращенцев есть C++.NET ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.05.2007, 08:16 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
Lepsik TelepatНахрен вам нужен С++. Сейчас C# "в моде". В C# вы точно забудете про прямую работу с "железом". И даже оператор delete Вам будет не нужен. С++ надо было учить лет пять назад, а сейчас C# рулит !!! когда был васик ппулярен, потом жаба. А все приложения как писались на С++ та и будут писаться. Тем более что для извращенцев есть C++.NET Как бы ни так. Разуйте глаза. Погуглите, пробежитесь по сайта в США (ИМЕННО США, так как по этой стране и нужно судить от IT-индустрии) и вы очень удивитесь, что популярность C# никак не ниже, а возможно и выше, популярности С++. Если Вы судите по России, то конечно тут лидер С++. Но судить по России глупо. Это как судить о моде в одежде по китайскому ширпотребу, а не по Милану, например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 02:56 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
Telepat wrote: > Нахрен вам нужен С++. Сейчас C# "в моде". В C# вы точно забудете про > прямую работу с "железом". И даже оператор delete Вам будет не нужен. С++ > надо было учить лет пять назад, а сейчас C# рулит !!! Ну а если я хочу напрямую с железом работать? И если не привлекает .NET? И если нужен язык, который дает прямой доступ к "сырой памяти"? И который поддерживается на большинстве платформ? Зачем мне тогда C#? А на моду, ИМХО, чихать надо - если заказчик умен, ему важен результат, а не на каком языке это писано... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 08:04 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
Telepat пишет: > Как бы ни так. Разуйте глаза. Погуглите, пробежитесь по сайта в США > (ИМЕННО США, так как по этой стране и нужно судить от IT-индустрии) и вы > очень удивитесь, что популярность C# никак не ниже, а возможно и выше, > популярности С++. Киркоров тоже популярный. Ну и что ? Как был 3.1415, так и остается. Не, ну конечно бабла гребет ... Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 10:45 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
ErV пишет: > Ну а если я хочу напрямую с железом работать? И если не привлекает .NET? И > если нужен язык, который дает прямой доступ к "сырой памяти"? И который > поддерживается на большинстве платформ? Зачем мне тогда C#? А на моду, Оно конечно про моду правильно, но напрямую с железом нельзя работать. А что такое "сырая память" - вообще не понятно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 10:47 |
|
||
|
За что любить STL и как жить в браке?
|
|||
|---|---|---|---|
|
#18+
MasterZiv wrote: > Оно конечно про моду правильно, но напрямую с железом нельзя работать. > А что такое "сырая память" - вообще не понятно. 1) Во первых, когда писал, очень спать хотел :). 2) Допустим, я захочу написать драйвер :) 3) Про "сырую память" - здесь меня переклинило. Имелась в виду адресная арифметика и т.д. Как понимаю, адресной арифметики в C# нет, указатели есть ("unsafe").. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2007, 16:03 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=34537871&tid=2028793]: |
0ms |
get settings: |
10ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 234ms |
| total: | 464ms |

| 0 / 0 |
