Если нужно рассматривать кусочек вектора как отдельный массив без копирования — есть span.
А если противоположная задача — объединить n векторов без копирования. Вот есть n векторов. Нужно их рассматривать как один — как бы получить указатель на общий массив данных, но при этом без копирования и выделения памяти — чтобы в памяти они так и остались разрозненными кусками.
Здравствуйте, Shmj, Вы писали:
S>Вопрос такой.
S>Вот есть n векторов. Нужно их рассматривать как один — как бы получить указатель на общий массив данных, но при этом без копирования и выделения памяти — чтобы в памяти они так и остались разрозненными кусками.
S>Есть ли что готовое? Что бы вы применили?
Обернул бы их в класс, у которого бы сделал свой итератор и []
Re: Объединение векторов без копирования - есть ли готовое?
Здравствуйте, Shmj, Вы писали:
S>Вопрос такой.
S>Вот есть n векторов. Нужно их рассматривать как один — как бы получить указатель на общий массив данных, но при этом без копирования и выделения памяти — чтобы в памяти они так и остались разрозненными кусками.
S>Есть ли что готовое? Что бы вы применили?
Ну тебе нужен специальный хитрый класс, хранящий вектор ссылок на спаны и который за O(n) пересчитывает индекс
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Re: Объединение векторов без копирования - есть ли готовое?
Здравствуйте, Shmj, Вы писали:
S>Вопрос такой.
S>Если нужно рассматривать кусочек вектора как отдельный массив без копирования — есть span.
S>А если противоположная задача — объединить n векторов без копирования. Вот есть n векторов. Нужно их рассматривать как один — как бы получить указатель на общий массив данных, но при этом без копирования и выделения памяти — чтобы в памяти они так и остались разрозненными кусками.
S>Есть ли что готовое? Что бы вы применили?
Здравствуйте, Shmj, Вы писали:
S>Есть ли что готовое? Что бы вы применили?
Для начала бы убедился в том, что мне это действительно надо.
Копирование само по себе — процесс достаточно быстрый, если речь не идет о каких-то совсем неприличных объемах данных. Вполне возможно даже, что выделение нового буфера из кучи займет больше времени чем, собственно, копирование.
С другой стороны, логическое объединение нескольких блоков в один с общим индексом. Оно, конечно, будет O(1). Но только всякие ветвления, то-сё. Коэффициент может получиться большим.
В общем, тут смотреть надо. Во-первых, если все в лоб сделать, действительно ли спад производительности как-то влияет на конечную задачу (а не на синтетические бенчмарки)? Во вторых, в контексте реальной задачи, действительно ли логическое объединение дает выигрыш по сравнению с физическим? В-третьих, если все упирается не в копирование, а в аллокацию, нельзя ли помудрить немного с аллокатотом? Ну и муторно все это, стоит ли реальный выигрыш всей этой возни?
Ну а так, понятно что делать. Нарисовать класс-обертку, который оборачивает эти самые вектора.
Re[3]: Объединение векторов без копирования - есть ли готовое?
Здравствуйте, Pzz, Вы писали:
Pzz>Копирование само по себе — процесс достаточно быстрый, если речь не идет о каких-то совсем неприличных объемах данных. Вполне возможно даже, что выделение нового буфера из кучи займет больше времени чем, собственно, копирование.
Конечно больше — но чтобы куда-то скопировать — нужно сначала выделить эту память. А это дорого.
Получается у меня данных в пакете примерно 20 Мб, но при этом много пользователей — около 1000 одновременных может быть в сек. Выделять на каждый чих каждому + 20 Мб. — это уже 20 гиг расход на пустом месте.
Pzz>Ну а так, понятно что делать. Нарисовать класс-обертку, который оборачивает эти самые вектора.
Ну выше что-то подобное привели из стандартной либы + мы c GPT наваяли вариантик.
Но беда в том что это не подошло — оно возвращает итератор и это бы подходило, если бы данные не передавались в либу на голом C, которая требует именно настоящий непрерывный блок памяти, а не итератор.
Re[3]: Объединение векторов без копирования - есть ли готовое?
Здравствуйте, Shmj, Вы писали:
Pzz>>Копирование само по себе — процесс достаточно быстрый, если речь не идет о каких-то совсем неприличных объемах данных. Вполне возможно даже, что выделение нового буфера из кучи займет больше времени чем, собственно, копирование.
S>Конечно больше — но чтобы куда-то скопировать — нужно сначала выделить эту память. А это дорого.
S>Получается у меня данных в пакете примерно 20 Мб, но при этом много пользователей — около 1000 одновременных может быть в сек. Выделять на каждый чих каждому + 20 Мб. — это уже 20 гиг расход на пустом месте.
Ты задачу-то опиши.
S>Но беда в том что это не подошло — оно возвращает итератор и это бы подходило, если бы данные не передавались в либу на голом C, которая требует именно настоящий непрерывный блок памяти, а не итератор.
А что за либа? Долго ли думает?
Есть куча архитектурных решений, из которых можно было бы выбирать. Например, можно зарезервировать один линейный буфер, и когда пользователь уже вывалил все свои данные, копировать их на минуточку в этот буфер, вызывать сишную либу, забирать результат а буфер предоставить для следующего запроса. Или, например, сделать не один буфер, а по числу ядер CPU, если либа шибко думательная.
Ты задачу-то опиши, а то ты пришел уже не с задачей, а с готовым решением, в котором ты не уверен.
Re[4]: Объединение векторов без копирования - есть ли готовое?