Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Vladimir_Pashutin
Дата сообщения: 08.08.2006 13:10
Mickey_from_nsk

Толком объяснить вряд ли смогу, но возможно, что это связано с разными реализациями косвенной адресации. Если как в примере с массивом который создается в стеке, то ничего кроме SP::BP+off компилятор сотворить не сможет, а реализации map<> могут работать и через MMX расширения.
Автор: WiseAlex
Дата сообщения: 08.08.2006 14:16
Vladimir_Pashutin

Цитата:
а реализации map<> могут работать и через MMX расширения

даже если и так, не думаю, что это поможет - с map действий всегда больше - поиск по ключу и извлечение второй части из pair. Плюс для создания и удаления map тратится больше времени, даже с умными аллокаторами из boost или StlPort
Автор: Vladimir_Pashutin
Дата сообщения: 08.08.2006 14:26
WiseAlex
Согласен конечно, что действий больше, но на некоторых реальных задачах map<> у меня работал быстрее чем массивы в стеке. Конечно руку на рельс не положу, что это достоверный факт, мож там было что-то кроме этого, но как говорится ложку-то мы нашли, но осадок остался.
Автор: WiseAlex
Дата сообщения: 08.08.2006 14:40
Vladimir_Pashutin

Цитата:
но на некоторых реальных задачах map<> у меня работал быстрее чем массивы в стеке.

я плохо разбираюсь в подсистеме работы с памятью, но на мой взгляд если массив болшой и обращение идет к небольшому количеству элементов из разных частей массива, то это вполне объяснио.
Кстати какие stl и компилятор использовались и проводились ли опыты с другими stl
Автор: Vladimir_Pashutin
Дата сообщения: 08.08.2006 15:00
WiseAlex
Серьёзных исследований по этому вопросу не проводил - говорю же чисто внешнее ощущение, хотя когда не сильно жмёт я привык доверять таким ощущениям и довольно редко в последнее время налетаю на грабли. Использовал последнее время только шестую стройку, до этого были опятьже Borland-ские 3.1 и 4.5 си-шные компиляторы. Вообще профилирование я делал только раз в жизни, когда надо было прорисовывать в реальном времени имитацию движения автомобиля ещё на AT-шках. В результате выявилось, что оптимизацией отдельных частей алгоритма, как-то разных аллокаторов, страничных ухищрений и тому подобными фокусами ускорить работу можно от силы на 20-30%, а требовалось в разы. Тогда я убил на это профилирование больше месяца практически без толку. Так что теперь доверяюсь ощущениям.
Извиняюсь, но больше на эту тему распространяться не охота.
Автор: Collapse Troll
Дата сообщения: 08.08.2006 15:32
а что, STL бывает нескольких видов? и что такое STLPort - проведите ликбез пожалуйста..
Автор: RedLord
Дата сообщения: 08.08.2006 15:54
Collapse Troll

Портированная под несколько компиляторов (кросс-компилерная)
реализация STL от SGI
Активно развивается.
__http://www.stlport.org/
Автор: Collapse Troll
Дата сообщения: 08.08.2006 17:38
RedLord, спасибо! иногда встречал в лбъявлениях "знание STLPort", вот и заинтересовался. то есть по сути это просто STL Степанова?
Автор: RedLord
Дата сообщения: 08.08.2006 18:34
Collapse Troll

SGI STL естественно является наследницей либы Степанова.
но в ней реализованы более широкие возможности (не включенные в стандарт),
на что есть сноски в доке.

"Стандартная" STL изменяется. сейчас уже есть промышленные реализации TR1 (недавние расширения стандарта STL)
Думаю изменяется и STLPort
Автор: Collapse Troll
Дата сообщения: 08.08.2006 19:20
RedLord, спасибо за пояснения!
Автор: SaDFromSpb
Дата сообщения: 09.08.2006 11:39
STL Степанова ?! Так что же, стандартную STL, получается, сделал "простой советский паренек"?!
Автор: Mickey_from_nsk
Дата сообщения: 09.08.2006 13:36
SaDFromSpb
Ну этот простой паренек уже давно работает не "в союзе" но к С++ это мало относится.
По поводу map vs array по собственному опыту могу сказать, что как ни крути, какие MMX не используй, быстрее косвенной только прямая адресация. Правда, помнится, была загадочная для меня команда ассемблера XLAT, но не думаю, что она работает быстрее косвенной адресации.
Остаются вопросы только в том, что у некоторых "продвинутых" программистов могут возникать заморочки с вычислением индексов массивов. То есть, время, требуемое для вычисления индекса может вполне быть сравнимым со временем прохода по дереву в map (а оно, кажись, на балансированных деревьях сделано). Отсюда и может возникать это "ощущение" той же скорости.
Прошу не воспринимать этот пост ни в чей адрес. Написано про абстрактных программистов, в т.ч. и про себя. Просто, проверьте выражение в квадратных скобках
Автор: Qraizer
Дата сообщения: 10.08.2006 14:09
Intel оставила XLAT в системе команд 8086 для совместимости с 8085. Как и LAHF/SAHF.
Автор: ivanmara
Дата сообщения: 14.08.2006 00:39
Подскажите что можно использовать для так называемого словаря. Есть масив структур пара: слово перевод ... необходимо получать быстрый перевод того или иного слова, что то типа функции translate("horse") которая вернёт на русском "лошадь". Естестевнно набор данных для словаря будет подготовлен заранее. Наверняка это уже кто реализовывал ?
Автор: Vladimir_Pashutin
Дата сообщения: 14.08.2006 05:50
ivanmara
А чем map<string> не устраивает?
Автор: Mickey_from_nsk
Дата сообщения: 14.08.2006 06:43
ivanmara
В дополнение к Vladimir_Pashutin
Надо только еще реализовать case insensitive поиск по строке.

Подход через map очень удобен в случае, если нужно однозначное отображение "английское слово"->"русское слово". Если у исходного слова возможны различные формы все существенно усложняется. Тогда надо реализовывать анализатор, который бы приводил слова к каноническому виду.
Автор: xdude
Дата сообщения: 14.08.2006 17:40
Mickey_from_nsk
Изначально вопрос был задан об однозначном переводе: "что то типа функции translate("horse") которая вернёт на русском "лошадь""
Но в принципе, так как слово может иметь несколько переводов, можно сделать что-то типа map<string,vector<string>>, тогда возвращаться будет список возможных переводов заданного слова. А case-insensitive-поиск с мапой вообще не проблема, получится что-то в этом роде:

Код:
struct compare_t
{
bool operator()(const string s1, const string s2) const
{
return strcasecmp(s1.c_str(), s2.c_str());
}
};

map <string,vector<string>,compare_t> vocabulary;

Автор: Jim_Web
Дата сообщения: 15.08.2006 01:24
Как проверить выделена ли память для указателя на класс ?
Данный вариант не проходит.

Код:
SomeClass * sc;
if (!sc)
sc = new SomeClass();
Автор: xdude
Дата сообщения: 15.08.2006 01:28
Jim_Web
Дык инициализировать его надо сначала в NULL:

Код:
SomeClass * sc=NULL;
if (!sc)
sc = new SomeClass();

Автор: SPlyer
Дата сообщения: 15.08.2006 01:41

Цитата:
Дык инициализировать его надо сначала в NULL:

А без инициализации никак нельзя?
Автор: xdude
Дата сообщения: 15.08.2006 01:50
SPlyer
Нет, иначе указатель будет ненулевой (т.е. !sc будет true), но указывать будет х.з. куда, на случайный участок памяти.
Автор: SPlyer
Дата сообщения: 15.08.2006 01:53
Кстати, вместо NULL лучше использовать просто 0.
Автор: xdude
Дата сообщения: 15.08.2006 02:01
Не факт. Некоторые компиляторы этого просто могут не понять, и будут ругаться на несоответствие типов. Хотя, я чаще использую именно 0, так как не включаю стантартные .h, где описывается NULL.
Автор: SPlyer
Дата сообщения: 15.08.2006 02:13

Цитата:
Не факт. Некоторые компиляторы этого просто могут не понять, и будут ругаться на несоответствие типов. Хотя, я чаще использую именно 0, так как не включаю стантартные .h, где описывается NULL.

Это только в старых C компиляторах, в С++ лучше пользоваться 0 и проблем с этим не возникнет.
Автор: xdude
Дата сообщения: 15.08.2006 02:19
SPlyer
А чем именно лучше? Меня всегда этот вопрос мучал: что лучше, 0 или NULL
Автор: SPlyer
Дата сообщения: 15.08.2006 02:50
Например в некоторых случаях, когда требуется константа при использовании NULL могут возникнуть проблемы, так как в C++ более строгая типизация чем в C. Использование 0 вместо NULL в C++ это как "внегласное соглашение", но разницы в использовании NULL или 0 с указателями никакой нет.
В C NULL определен как ((void*)0), т.к его подразумевалось использовать только с указателями, поэтому эсли NULL в C использовать например с int'ом компилятор будет ругаться.
Автор: Mickey_from_nsk
Дата сообщения: 15.08.2006 06:18
SPlyer

Цитата:
Кстати, вместо NULL лучше использовать просто 0.

А чем лучше? В смысле типизации, что ли? То есть мы, засандаливая в указатель целое число говорим, что лучше типизируем? Не, понятно, что компилятор разрулит это, но зачем оно надо? Если NULL это уже указатель?
С моей т.з., использование NULL показывает явно, что дело мы имеем с указателем.

Цитата:
А без инициализации никак нельзя?

Лучше привыкать сразу все переменные инициализировать, хотя бы NULL-значением. Проще будет в отладке - assert можно будет выставлять и т.д.
Автор: FireZone
Дата сообщения: 15.08.2006 08:16
Существует ли чисто плюсовой аналог микрософтовской конструкции __try - __finally?
Или как проще записать на чистом C++ нижеследующее:
Код: занять ресурс;
__try{
..
if (...) return;
..
throw ...
...
if (...) return;
..}
__finally{
освободить ресурс;
}
Автор: vshersh
Дата сообщения: 15.08.2006 08:44
FireZone
Можно использовать "умные указатели"...
Автор: RedLord
Дата сообщения: 15.08.2006 08:56
FireZone
выделение ресурса есть инициализация (Б.Страуструп)


struct RcHelper
{
RcHelper()
{
// выделить ресурс
}

~RcHelper()
{
// освободить ресурс
}
}

работа с ресурсом:

{
RcHelper save_state; // захватываем ресурс
....
if (...) return;
..
throw ...
...
if (...) return;


}// здесь отработает деструктор и освободит ресурс

естественно это только пример. RcHelper - только пример.
вместо него можно юзать boost::shared_ptr или подобных

основное - идея, что выделение ресурса есть инициализация.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.