LINUX.ORG.RU

Boost 1.82

 ,


2

6

Вышла новая версия Boost, набора кроссплатформенных библиотек C++. Некоторые крупные изменения:

  • более 20 библиотек запланировали отказ от поддержки C++98 в течение двух следующих релизов; минимальным требованием станет компилятор с поддержкой C++11 (например, gcc 4.8 и выше);
  • некоторые библиотеки (Math, Multiprecision) повышают требования к стандарту до C++14 (gcc 5, clang 5);
  • Mysql: новая библиотека на основе Asio, клиент MySQL;
  • Unordered: unordered_node_map, unordered_node_set - новые контейнеры на основе открытой адресации.

А также множество улучшений и исправлений в Core, Asio, Filesystem, JSON, Math, URL и других библиотеках.

>>> Подробности

★★★★

Проверено: maxcom ()

Boost 1.82

Нравится?
Используйте!

Для меня главное чтобы человек хороший был, а «алгоритмические войны» - не мое.

Forum0888
()
Ответ на: комментарий от bugfixer

И да - возвращаясь к предмету разговора - примеры будут?

примеры чего??? я все уже изложил. если вы не поняли, перечитайте еще пару раз.

alysnix ★★★
()
Ответ на: комментарий от bugfixer

не засоряйте топик своей мутотой. тут про буст, а не про ваши рефлексии. откройте тему в толкс и рефлексируйте там.

alysnix ★★★
()
Ответ на: комментарий от alysnix

откройте тему в толкс и рефлексируйте там.

Господа что вас лайкнули скорее всего недолго вас знают. На фоне всего что вы здесь успели наговорить меня бы интересовало несколько вещей:

  • хотя бы один (один, Карл!) пример вашего волшебного кода

  • хотя бы одна (одна, Карл!) ссылка на пост где бы вы признали что неправы

А до тех пор - вы мягко говоря - трепло.

bugfixer ★★★★★
()
Ответ на: комментарий от bugfixer

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

alysnix ★★★
()

А также множество улучшений и исправлений в Core, Asio, Filesystem, JSON, Math, URL и других библиотеках.

Рекомендую https://github.com/harbour/core

Лет шесть назад перевел его на C++.

В нем богатейший кроссплатформенный core API.
Этот API «не прибит гвоздями» к языку программирования Clipper, который поддерживает этот проект.
В проекте конечно имеется совместимость с Clipper, но это вовсе не Clipper (для разработки его не использую).
Зачем изобретать велосипеды если профессионал двадцать лет назад его разработал?
Например API для работы с файлами имеет десятки функций, ...
Некоторый API пришлось подрихтовать, но это много времени не заняло.
Ныне правда почти не использую API этого проекта, так как разработал свой, но автору проекта - РЕСПЕКТ!

Кстати в harbour отличная VM.

На форуме иногда спрашивают - «Подскажите проект, который содержит API для вычисления выражений в run-time?».
Много плюшек в этом проекте!

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 5)
Ответ на: комментарий от alysnix

вернитесь в буст, или уе..

Вы же гений программирования? Ну так покажите мне ваш эквивалент boost::circular_buffer. Так слабо же. Ни строчки ещё продемонстрировано не было. Только тро-ло-ло.

bugfixer ★★★★★
()
Ответ на: комментарий от untitl3d

Как минимум слишком сложный API с бессмысленной шаблонизацией на каждый чих. Альтернативы – руками написать классы Instant и Duration как в java.

Reset ★★★★★
()
Последнее исправление: Reset (всего исправлений: 1)
Ответ на: комментарий от untitl3d

Раз шаблонизация бывает бессмысленной

А данном случае бессмысленна. Мне не понятно зачем шаблонизировать duration интервалом. Это усложняет код, который это использует. Надо либо на пустом месте шаблонизацию городить либо завязываться на конкретный duration. Наносекунды хватит для всего.

боюсь спрашивать у вас про constrexpr во ВСЕ поля.

Смотря какое. Когда городят if’ы над этими constexpr и на пустом месте увеличивают время компиляции в разы без роста производительности, то конечно руки отрывать надо.

Reset ★★★★★
()
Ответ на: комментарий от eternal_sorrow

В бусте гораздо больше компонентов, чем этот список

Да, и многие из них header-only. Ни один so-файл не относится больше чем к одному компоненту.

Кстати, это ведёт и к тому, что иногда линковать программу с бустом вообще не приходится.

и в перспективе внести некоторые из них в стандартную библиотеку

Но ведь так и происходит.

f1u77y ★★★★
()
Ответ на: комментарий от fsb4000

С чего вдруг?

Скорее субъективщина, но подход с форматными строками (правда, не printf-like, а fmt-like) выглядит лучше. К тому же он ещё и более расширяем, потому что в iostreams наличие стейтов для форматирования вывода (типа std::hex, std::fixed) захардкожено, а в fmt-like можно добавить какие угодно свои стейты.

А если говорить про быстродействие, то да, незначительно быстрее, есть выключить всё ненужное.

f1u77y ★★★★
()
Ответ на: комментарий от Forum0888

И еще.

Harbour у меня это обычная dll, в которой можно использовать весь API core.
Без проблем можно собрать elf, ...

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

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от X512

Ну да, это новая фича, но уже с С++20 можно написать однострочную обёртку над std::format_to, если хочется

f1u77y ★★★★
()

Можно ли её использовать для моего кроссворда, например для работы с сеткой кроссворда или оптимизировать алгоритм поиска слов в словаре?

xwicked ★★☆
()
Ответ на: комментарий от f1u77y

Вон в софте в файлах переводов так и пишут Hello %s, you have %i credits. Очень удобно

А ещё можно прямо в бинарнике программы строки править. Сразу всё понятно. А с iostream такого удобства нету.

Стейты iostream вообще просто ненавижу. Уж лучше свой велосипед

bga_ ★★★★
()
Последнее исправление: bga_ (всего исправлений: 2)
Ответ на: комментарий от bga_

У меня так:

  pchResult =
   Metastrcat(
    pchResult,
    "Hello ",
    pchString01,
    ", you have ",
    pchString02,
    " credits"
    1
   );

Работает быстро (и выделение памяти происходит лишь один раз)!

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от bga_

Это не template.

template<Args…>? Можно формировать из чего угодно?

Например так:

 *(char **) pAddItem = 
  Metastrcat( 
   *(char **) pAddItem ,
   argv[ i ] + 2 ,
   1
  );

Как угодно!

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от bga_

Фича Metastrcat() в том, что не нужно использовать никакой форматной строки.
Не нужно ее использовать там, где и без нее можно обойтись без проблем.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от Forum0888

Моё чтобы в юзерские шаблоны свои данные подставлять. И например медленно писать в UART. При этом жрать минимум ОЗУ

bga_ ★★★★
()
Последнее исправление: bga_ (всего исправлений: 1)
Ответ на: комментарий от bga_
// -------------------------------------------------------
// --- Добавляет строки к исходной
//
CHAR  * Metastrcat(
 CHAR  *pSource,
 ...
) {
/*

 pSource                Исходная строка

*/

  INT    iVp01           = 0;                              //        

  CHAR   *pTemp          = nullptr;                        // Значение аргумента
  INT    cntpTemp        = NULL;                           // Длина значения аргумента функции

  CHAR   *pResString     = nullptr;                        // Результирующая строка
  INT    cntResString    = NULL;                           // Длина результирующей строки

  CHAR   *pCurpResString = nullptr;                        // Адрес текущей позиции в результирующей строке

  CHAR   **pArgument     = nullptr;                        // Адрес значения аргумента функции

  INT    cntpSource      =                                 // Длина pSource
   Metastrlen(
    pSource
   );

// Рассчет количества символов во всех аргументах функции
//
  CHAR  *p = (CHAR *) &pSource;

  while ( 1 ) {

   pTemp = *(CHAR **) p;

   if  ( pTemp == (CHAR *) 1 )
    break;

   cntResString +=                                         // Длина результирующей строки
    Metastrlen(
     pTemp
    );
   
   p = (CHAR *) ( (BYTE *) p + 4 );                        // Адресуем следующий аргумент

  }                                                        // while ( 1 ) {

// Выделяем память для результирующей строки
//

  pResString = (CHAR *) malloc( ( cntResString + 1 ) * sizeof( CHAR ) );

  *(CHAR *) ( (CHAR *) pResString + cntResString ) =       // Сформировали строку
   (CHAR) 0;

// Формируем текст результирующей строки
//
  pCurpResString =                                         // Адрес текущей позиции в результирующей строке
   (CHAR *) pResString;

// Получаем знчения аргументов функции и помещаем их в результирующую строку
//
  p = (CHAR *) &pSource;

  while ( 1 ) {

   pTemp = *(CHAR **) p;

   if  ( pTemp == (CHAR *) 1 )
    break;

   cntpTemp =                                              // Длина значения аргумент
    Metastrlen(
     pTemp
    );

// Копируем значение аргумента
//
   memcpy(
    pCurpResString,                                        // Адрес результирующей строки
    pTemp,                                                 // Адрес исходной строки
    cntpTemp * sizeof( CHAR )                              // Количество копируемых байт
   );

   pCurpResString  +=                                      // Адрес текущей позиции в результирующей строке
    cntpTemp;
   
   p = (CHAR *) ( (BYTE *) p + 4 );                        // Адресуем следующий аргумент

  }                                                        // while ( 1 ) {

  *( pResString + cntResString ) = '\0';                   // Сформировали строку

  free(                                                    // Освободили память память, содержащюю данные до добавления строки
   pSource
  ); 

  return  pResString;                                      // 

}
Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от f1u77y

Но ведь так и происходит.

И при этом всё ещё остаются проекты, которые зависят от буст. Ну и да. Эти проекты почему то тянут буст целиком а не отдельные библиотеки из его состава. Почему бы это?

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Ну во первых, это мало. В бусте гораздо больше компонентов, чем этот список. Нужно разбить ещё сильнее.

Слишком много библиотек - это тоже плохо.

А во вторых, эти библиотеки разве поставляются каждая в отдельном пакете?

Ага.

libboost1.74-all-dev              libboost-math1.74.0
libboost1.74-dev                  libboost-math1.74-dev
libboost1.74-doc                  libboost-math-dev
libboost1.74-tools-dev            libboost-mpi1.74.0
libboost-all-dev                  libboost-mpi1.74-dev
libboost-atomic1.74.0             libboost-mpi-dev
libboost-atomic1.74-dev           libboost-mpi-python1.74.0
libboost-atomic-dev               libboost-mpi-python1.74-dev
libboost-chrono1.74.0             libboost-mpi-python-dev
libboost-chrono1.74-dev           libboost-nowide1.74.0
libboost-chrono-dev               libboost-nowide1.74-dev
libboost-container1.74.0          libboost-nowide-dev
libboost-container1.74-dev        libboost-numpy1.74.0
libboost-container-dev            libboost-numpy1.74-dev
libboost-context1.74.0            libboost-numpy-dev
libboost-context1.74-dev          libboost-program-options1.74.0
libboost-context-dev              libboost-program-options1.74-dev
libboost-contract1.74.0           libboost-program-options-dev
libboost-contract1.74-dev         libboost-python1.74.0
libboost-contract-dev             libboost-python1.74-dev
libboost-coroutine1.74.0          libboost-python-dev
libboost-coroutine1.74-dev        libboost-random1.74.0
libboost-coroutine-dev            libboost-random1.74-dev
Skullnet ★★★★★
()
Ответ на: комментарий от eternal_sorrow

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

Reset ★★★★★
()
Ответ на: комментарий от Reset

А еще они любят тащить буст конкретной версии и даже содержат его в своем дереве исходников

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

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

Это всё необоснованные страхи, скорее в Boost появится очередной слой совместимости, чем что-то выпилят пользующееся спросом.

Недавно обновлял проект встроенной прошивки QNX 6.5 (2012 год) собираемый gcc C++03 с boost 1.74 (2020 год) до последней 1.81. Сам был настроен скептически, но был приятно удивлён, что пришлось только изолировать парой строчек появившейся и конфликтующий snprintf в пространстве имён из-за древней STL в QNX. Несмотря на то, что мейнтенеры boost грозились вот-вот дропнуть поддержку старого стандарта, но по факту не дропнули. Мне кажется, что в их понимании дропнуть - это просто не требовать от новых библиотек компилироваться старыми компиляторами, а существующие курочить никто не будет.

raspopov
()
Ответ на: комментарий от eternal_sorrow

И при этом всё ещё остаются проекты, которые зависят от буст.

А что не так-то?..

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

Это кто там все бустовые библиотеки подлинковывает в свой бинарь? Ни разу не видел таких.

f1u77y ★★★★
()
Ответ на: комментарий от bga_

%s, %i

Это устаревший и к тому же error-prone метод. Особенно если в коде идут типы с известным размером (вида uint64_t). printf("a = %" PRIu64 "; b = %" PRIuFAST32\n", a, b) выглядит не лучше iostreams.

f1u77y ★★★★
()
Ответ на: комментарий от f1u77y

Потому что нужен string interpolation как в нормальных яп. А не изобретение одинаково кривых велосипедов

bga_ ★★★★
()
Ответ на: комментарий от bga_

Это все для compil-time.

Разрабатываемый API для работы с метаданными имеет много большую функциональность и используется в run-time.

Forum0888
()
Ответ на: комментарий от f1u77y

А что не так-то?..

Вместо того чтобы переходить на реализацию из std.

все бустовые библиотеки подлинковывает в свой бинарь

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

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Причём тут подлинковываать?

При том что линковка к либе показывает то, зависит ли бинарь от неё в рантайме.

на уровне системы сборки

То есть кто-то указывает, например, в cmake boost без components? Может и да, но мне и самому интересно, кто так делает из крупных проектов? Более того, ЕМНИП, если в том же cmake не перечислить компоненты, то программа вообще ни с одной бустовой либой не линкуется.

на уровне пакетного менеджера

Как уже сказали выше, это почти всегда проблемы конкретных дистрибутивов и мейнтейнеров.

Вместо того чтобы переходить на реализацию из std.

Обычно если альтернатива в std есть, а софт на неё не переходит, это имеет под собой какую-то причину. Например, необходимость поддерживать старые стандарты С++ и компиляторы. Или просто софтом никто не занимается.

f1u77y ★★★★
()
Ответ на: комментарий от f1u77y

Как уже сказали выше, это почти всегда проблемы конкретных дистрибутивов и мейнтейнеров.

И как ты думаешь, имеет ли эта проблема какие то причины кроме лени мейнтейнеров?

Обычно если альтернатива в std есть, а софт на неё не переходит, это имеет под собой какую-то причину.

Именно. А причина проста. Когда какой то проект подтягивает буст, он обычне не подтягивает его ради какого то одного компонента. Если уже используется буст, то почему бы не использовать по полной все возможности, которые он предоставляет. Таким образом проект становится жёстко завязан на буст без какой либо надежды избавиться от него. Даже когда отдельные компоненты буст добавляют в std, проекты не преходят на эту реализацию и продолжают использовать реализацию буст, потому что это ничего им не даст.

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

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

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

В Bitcoin убрали часть зависимостей от boost.

Например:

https://github.com/bitcoin/bitcoin/pull/21059

https://github.com/bitcoin/bitcoin/pull/13734

https://github.com/bitcoin/bitcoin/pull/20480

Хотя проект по-прежнему использует boost: https://github.com/bitcoin/bitcoin/blob/b22c275582ccadc172d213d30cc261cc858f8b8e/test/lint/lint-includes.py#L24-L34

EXPECTED_BOOST_INCLUDES = ["boost/date_time/posix_time/posix_time.hpp",
                           "boost/multi_index/hashed_index.hpp",
                           "boost/multi_index/ordered_index.hpp",
                           "boost/multi_index/sequenced_index.hpp",
                           "boost/multi_index_container.hpp",
                           "boost/process.hpp",
                           "boost/signals2/connection.hpp",
                           "boost/signals2/optional_last_value.hpp",
                           "boost/signals2/signal.hpp",
                           "boost/test/included/unit_test.hpp",
                           "boost/test/unit_test.hpp"]

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

Также и от Qt, нужно использовать зависимости в зависимости от потребностей, а не все классы Qt, часть из которых не нужна.

Хотя согласен, многие действуют по той модели которую ты описал.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 2)
Ответ на: комментарий от fsb4000

Одна из классных вещей, которые есть в буст - это asio. Но с недавних пор существует https://github.com/chriskohlhoff/asio на которую можно было бы перейти с boost asio. Однако проекты, которые используют asio, также тащат ещё кучу всякой каки из буста и поэтому не видят для себя резона даже начинтать переход.

С Qt та же ситуация. Я много раз смотрел небольшие проекты на Qt с целью портировать их GUI на GTK. Но каждый раз в таких проектах оказывалось что они так же используют Qt для сети например. А зачастую вообще для всего, в том числе даже для строк. Таким образом я считаю что Qt это отдельный язык программирования. Хот его синтаксис похож на синтаксис C++ и компилятор C++ даже используется в процессе компиляции, это всё равно отдельный язык, потому что Qt заменяет собой практически всю стандартную библиотеку.

В Bitcoin убрали часть зависимостей от boost.

Это круто, но если они не делают это с целью избавиться от boost полностью, то от этого толку нет.

eternal_sorrow ★★★★★
()
Последнее исправление: eternal_sorrow (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

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

Всё же в Qt всё гораздо хуже. Упомянутая тобой QString это главная проблема, вторая это их контейнеры, третья - их прекомпиляция для сигналов. Но основная проблема это QString… Такого в boost всё же нет.

sena ★★
()
Ответ на: комментарий от Skullnet

И это - малая часть буста.

Заметная часть буста - хидер-онли. .so-шки делают те неудачники, которые не сумели запилить библиотеку шаблонов под свою предметную область.

Когда-то, очень давно, я сделал из проекта, собиравшегося десять минут, проект, собиравшийся сорок минут. Буквально добавлением одного небольшого C++ файла

AlexM ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Qt это прежде всего хороший графический тулкит, этим он ценен, но внутри все виджеты, все библиотеки повсеместно используют QString вместо std::string. Из-за этого многие авторы программ не задумываясь о последствиях используют QString в своём коде. В итоге, при попытке перенести приложение на другой графический тулкит, возникают серьёзные проблемы, которых бы не было, если бы Qt использовал std::string вместо QString. Гораздо меньше, но тоже вредит зависимость программ от прекомпилятора для реализации сигналов, хотя они вполне могли бы воспользоваться какой-нибудь готовой библиотекой на теплейтах. Ну и их параллельная реализация контейнеров тоже лишняя во многом. В бусте нет своей версии std::string, контейнеры буста дополняют, а не заменяют собой стандартные и прекомпилятор не нужен.

sena ★★
()
Ответ на: комментарий от eternal_sorrow

А зачем?

Ну, вот зачем разработчику беспокоиться о валяющихся у него на диске заголовочных файлах (а буст состоит, в основном, из них)?

AlexM ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.