Перейти к содержанию
    

Какой шаблон из STL применить когда надо поддерживать прием по нескольким каналам?

Асинхронно, но в одном потоке от разных источников (скажем узлов сети) принимаем блоки для составления из них некоторого количества разных пакетов. 
При приеме по заголовку блока определяем к какому пакету он принадлежит и соответственно его туда записываем после некоторых преобразований (скажем расшифровки)
В шаблоне должны хранится  структуры данных стэйт машин для составления пакетов.  Эти структуры в начале приема создаются, а конце приема пакета удаляются.  

Вопрос что выбрать из шаблонов STL для  этого?  
Чтобы идентификация "блок -> пакет" была максимально быстрой и простой, и управление массивом структур данных незамороченным.   
Масштабируемость тоже важна. Допустим сборка  1000 пакетов одновременно.  

Смотрю в SLT  list - избыточный.
Смотрю vector - в нем нет элементарно получения индекса после размещения с помощью push_back
  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть вам посмотреть std::map? Там как раз возможна пара "ключ"-"данные". Причём структура ключа может быть весьма нетривиальной. Правда на счёт быстродейтсвия этого контейнера не уверен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 minutes ago, haker_fox said:

Может быть вам посмотреть std::map? Там как раз возможна пара "ключ"-"данные". Причём структура ключа может быть весьма нетривиальной. Правда на счёт быстродейтсвия этого контейнера не уверен.

Ну да.
Только этот map нужно снабдить еще своей функцией или объектом сравнения  и еще своим аллокатором, и еще там итераторы на каждом шагу надо применять. 
Получаем клубок зависимостей на ровном месте. 
Легче уже взять статический массив. 

Одновременно ищу способ заменить классы коллекций Delphi, на которых раньше все было сделано. 
Поскольку напрямик в C++  builder применить дельфийские дженерики(аналоги шаблонов в С++) TList, TQueue... не удается, для этого нужно оставлять куски на Delphi.
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 hours ago, AlexandrY said:


Смотрю vector - в нем нет элементарно получения индекса после размещения с помощью push_back
  

индекс после push_back всегда будет равен size()-1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, gridinp said:

индекс после push_back всегда будет равен size()-1

Всегда - это как понять?  Под ваши личные гарантии? :biggrin:
Шаблон использует динамическое выделение памяти, та в свою очередь делается через сервисы ОС.
Т.е. везде можно ждать отказов в сервисе и исключений. 
Есть ли гарантия что после появления исключения в какой либо операции этого шаблона тот самый индекс останется валидным?  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, AlexandrY said:

Есть ли гарантия что после появления исключения в какой либо операции этого шаблона тот самый индекс останется валидным?  

Вы правы, нет такой гарантии, стоит ещё наверное рассмотреть случай с BSOD и kernel panic

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, gridinp said:

Вы правы, нет такой гарантии, стоит ещё наверное рассмотреть случай с BSOD и kernel panic

Нет, BSOD и kernel panic происходят в другом процессе. 
Я же пишу об обработке ситуаций в одном потоке.

Но если серьезно, то как обстоят дела с реализацией шаблонов.
Они стандартизированы на уровне сорсов или только на уровне описания интерфейса к ним? 
Т.е. надо ли ожидать что шаблоны в C++ Builder и в Visual Studio будут иметь разные сорсы?  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, наверное стоит ожидать, что разные исходники: https://en.wikipedia.org/wiki/Standard_Template_Library#Implementations

Если хотите одинаковые исходники, может посмотреть в сторону Boost

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 minutes ago, gridinp said:

Да, наверное стоит ожидать, что разные исходники: https://en.wikipedia.org/wiki/Standard_Template_Library#Implementations

Если хотите одинаковые исходники, может посмотреть в сторону Boost

Мда, действительно, Как может быть реализация STL быть одинаковой если сами компиляторы сильно разные. 
А Boost даже под builder идет в 3-х версиях!
Т.е. одинаковостью и не пахнет.    

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 minutes ago, AlexandrY said:

А Boost даже под builder идет в 3-х версиях!

Boost под всё собирается из одних исходников, его самому несложно собрать, ну версии, да разные 1.58 или там 1.71

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 minutes ago, gridinp said:

Boost под всё собирается из одних исходников, его самому несложно собрать, ну версии, да разные 1.58 или там 1.71

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 12/30/2019 at 9:00 PM, AlexandrY said:

Одновременно ищу способ заменить классы коллекций Delphi, на которых раньше все было сделано

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

 

А всем остальным может помочь вот такая шпаргалка: https://habr.com/ru/company/infopulse/blog/194726/

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, esaulenka said:

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

 

А всем остальным может помочь вот такая шпаргалка: https://habr.com/ru/company/infopulse/blog/194726/

Мне помогать не надо. Вопрос был пятиминутный.
Но просто хочу немного просвятить.
Когда я писал  Delphi , то имел в виду библиотеку VCL, а не язык. VCL весь смапирован на C++. 
Так вот VCL и STL практически не совместимы. Потому что VCL поддерживает ARC, а STL нет. В STL нельзя использовать сложные типы VCL.  
И STL неинвазивный, т.е. контейнеры все время копируют элементы, а это оверхед по операциям с динамической памятью. 
В VCL же есть все то, что имеет STL и гораздо больше.  И эти вещи конечно не сравнимые. 


  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 hours ago, AlexandrY said:

Мне помогать не надо. Вопрос был пятиминутный.

"STL за пять минут" - это покруче будет, чем "C++ за 21 день"! :-)

 

11 hours ago, AlexandrY said:

Потому что VCL

... г-но мамонта, криво-косо спортированное из дельфей в C++ builder. Имхо.

 

11 hours ago, AlexandrY said:

VCL поддерживает ARC, а STL нет

Не являюсь экспертом по билдеру, но что-то мне кажется, что этот automatic reference counting - этакий std::shared_ptr, прибитый к TObject. Соответственно, std::vector из указателей на производные от TObject будет так же считать эти ссылки.

 

11 hours ago, AlexandrY said:

контейнеры все время копируют элементы

Если это критично, пользуйтесь контейнерами из указателей. Впрочем, лично у меня программы почему-то не "всё время копируют", а ещё и модифицируют данные. Там и копия как-то к месту смотрится.

 

11 hours ago, AlexandrY said:

 И эти вещи конечно не сравнимые.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 часов назад, esaulenka сказал:

Если это критично, пользуйтесь контейнерами из указателей.

Ещё есть moving semantic, которая позволяет избежать копирования, если оно не нужно. Как обычно видим резкие категоричные выводы на фоне незнания предмета. Правильный ответ для вопрошающего: STL как и C++ в целом ему не нужен, т.к. для него конкретно бесполезен по причине незнания и неприятия оного инструмента.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...