I sh, чтобы удалить char*
и заменить его на std::vector<char>
.
Это хорошо. Но этого не произойдет.
Во-первых, прекратите рассматривать отображение памяти как временную операцию. Если вы собираетесь отобразить блок памяти, сделайте это один раз, когда выделите его, и держите указатель вокруг. vkUnmapMemory
следует вызывать только тогда, когда вы собираетесь освободить отображенную память.
Также сопоставьте весь блок памяти, поскольку любое выделение памяти может только быть нанесенным на карту один раз. И вы, несомненно, уже знаете, не вызывать vkAllocateMemory
для каждого отдельного отдельного буфера, который вы хотите создать.
Во-вторых, отображение памяти означает, что устройство Vulkan делает память доступной для ЦП для чтение / запись (на основе операции отображения). Вы не владеете этой памятью; устройство Vulkan владеет им. Он просто делится этим указателем с вами.
vector
владеет памятью, которую он выделяет. Он выделяет его и удаляет его через указанный пользователем тип распределителя.
Теперь вы можете подумать, что вы можете просто создать vector<char, MappedAllocator<char>>
, где MappedAllocator
- это некоторый объект распределителя, который «выделяет» его память из сопоставленного указателя. Но это не сработает. Видите ли, распределитель выделяет память, но vector
- это тот, кто решает , сколько памяти выделять и когда выделять.
Не имея возможности контролировать, сколько памяти vector
может попытаться выделить, на самом деле не существует эффективного способа записать распределитель в статический c буфер памяти.
Если вы просто хотите отслеживать размер отображаемого хранилища, он было бы лучше использовать что-то вроде gsl::span<char>
. Но в противном случае, просто указатель и делать указатель-у вещи. Не стоит пытаться написать собственную версию vector
только для этого.