Может ли std :: vector избежать копирования, если allocator предоставляет семантику realloc?

У меня есть интерфейс памяти, который отделяет получающее адресное пространство от присоединяемого резервного хранилища. (В Linux пул адресного пространства, управляемый интерфейсом, состоит из mmap’а MAP_ANONYMOUS и MAP_NORESERVE, madvise’ed MADV_DONTNEED и mprotect’ed PROT_NONE. Затем резервное копирование присоединяется madvise MADV_WILLNEED и mprotect PROT_READ, PROT_EXT. PROT_EXT).

Этот интерфейс позволяет мне выделять большое количество адресного пространства, лениво получая реальную физическую память. Я хотел бы использовать это для создания «ленивого вектора», который делает запросы на резервное хранилище в соответствующих точках, но никогда не копирует текущее содержимое вектора по мере его роста.

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

9

Решение

В стандартном интерфейсе распределителя библиотек отсутствует положение для изменения размера существующего блока памяти. Там просто «выделить блок размером N» и «освободить блок» семантика.

Итак, ответ на ваш вопрос: «Нет, вы не можете сделать это с std::vector«

Конечно, вы можете написать свой собственный вектороподобный класс, который делает это — и если это то, что важно для вас, вы должны это сделать. Написание контейнерного класса не очень тот жесткий.

0

Другие решения


По вопросам рекламы [email protected]