Постоянная конфигурация с шаблоном посетителей и статическим распределением памяти. ⇐ C++
Постоянная конфигурация с шаблоном посетителей и статическим распределением памяти.
Я готовлю модуль постоянной конфигурации для встроенного проекта. Я хочу использовать сериализацию, реализованную с использованием шаблона посетителя:
struct SoftwareInfo { версия uint32_t; std::array commitHash; uint32_t buildDate; шаблон недействительный пакет (архив T&) { archive.process(версия); archive.process(commitHash); archive.process(buildDate); } }; Что касается модуля хранения, я хотел бы зарегистрировать каждую структуру следующим образом:
PersistentConfig conf{}; conf.register(&softwareInfo, "swinfo"); conf.register(&фу, "фу"); а затем выполнить функцию записи или чтения, которая принимает все зарегистрированные объекты и сериализует или десериализует их для операций записи или чтения. Записывать их все одновременно удобнее, так как я не могу записать на FLASH, который не был стерт заранее, а минимальный размер стирания составляет одну страницу (2048B).
Поскольку это встроенный проект, я бы хотел избежать динамического выделения ресурсов, и у меня возникают проблемы с реализацией класса PersistentConfig без него. Я представляю, что он содержит массив указателей на некий persistentEntry, в котором я могу зарегистрировать структуры:
struct persistEntry { Объект EntryBase*; std::string_view имя; размер uint32_t; uint32_t datacrc32; }; записи std::array; Я подумал о создании класса EntryBase, а затем о шаблонном производном классе, который мог бы содержать указатель на любой тип зарегистрированных объектов:
класс EntryBase { публика: виртуальный ~EntryBase() {} виртуальный пакет bool(сериализатор::Packer& упаковщик) = 0; виртуальный пакет bool(serializer::Unpacker& unpacker) = 0; }; шаблон класс Entry: public EntryBase { публика: явная запись (элемент T*): элемент (элемент) { } bool package(serializer::Packer& Packer) переопределить { возврат товара->упаковка(упаковщик); } bool package(serializer::Unpacker& unpacker) переопределить { вернуть товар->упаковать(распаковщик); } Т* константный элемент; }; но тогда мне нужно создать запись в куче во время события регистрации:
шаблон bool RegisterEntry (PackableObject* obj, const std::string_view& name) { записи.at(numberOfEntries).object = новая запись(obj); //Я бы хотел этого избежать записи.at(numberOfEntries).name = имя; записи.at(numberOfEntries).hashName = Контрольная сумма::crc32(name.data(), name.size()); вернуть ++numberOfEntries > maxEntries; } Я также думал о сохранении только указателя на функцию pack, но, поскольку она также является шаблонной, это тоже не сработает.
Есть ли способ хранить указатели зарегистрированных структур без необходимости динамического выделения объектов Entry? Или мне следует придерживаться этого решения и просто создать фиксированный пул памяти, который я смогу безопасно выделить?
Я готовлю модуль постоянной конфигурации для встроенного проекта. Я хочу использовать сериализацию, реализованную с использованием шаблона посетителя:
struct SoftwareInfo { версия uint32_t; std::array commitHash; uint32_t buildDate; шаблон недействительный пакет (архив T&) { archive.process(версия); archive.process(commitHash); archive.process(buildDate); } }; Что касается модуля хранения, я хотел бы зарегистрировать каждую структуру следующим образом:
PersistentConfig conf{}; conf.register(&softwareInfo, "swinfo"); conf.register(&фу, "фу"); а затем выполнить функцию записи или чтения, которая принимает все зарегистрированные объекты и сериализует или десериализует их для операций записи или чтения. Записывать их все одновременно удобнее, так как я не могу записать на FLASH, который не был стерт заранее, а минимальный размер стирания составляет одну страницу (2048B).
Поскольку это встроенный проект, я бы хотел избежать динамического выделения ресурсов, и у меня возникают проблемы с реализацией класса PersistentConfig без него. Я представляю, что он содержит массив указателей на некий persistentEntry, в котором я могу зарегистрировать структуры:
struct persistEntry { Объект EntryBase*; std::string_view имя; размер uint32_t; uint32_t datacrc32; }; записи std::array; Я подумал о создании класса EntryBase, а затем о шаблонном производном классе, который мог бы содержать указатель на любой тип зарегистрированных объектов:
класс EntryBase { публика: виртуальный ~EntryBase() {} виртуальный пакет bool(сериализатор::Packer& упаковщик) = 0; виртуальный пакет bool(serializer::Unpacker& unpacker) = 0; }; шаблон класс Entry: public EntryBase { публика: явная запись (элемент T*): элемент (элемент) { } bool package(serializer::Packer& Packer) переопределить { возврат товара->упаковка(упаковщик); } bool package(serializer::Unpacker& unpacker) переопределить { вернуть товар->упаковать(распаковщик); } Т* константный элемент; }; но тогда мне нужно создать запись в куче во время события регистрации:
шаблон bool RegisterEntry (PackableObject* obj, const std::string_view& name) { записи.at(numberOfEntries).object = новая запись(obj); //Я бы хотел этого избежать записи.at(numberOfEntries).name = имя; записи.at(numberOfEntries).hashName = Контрольная сумма::crc32(name.data(), name.size()); вернуть ++numberOfEntries > maxEntries; } Я также думал о сохранении только указателя на функцию pack, но, поскольку она также является шаблонной, это тоже не сработает.
Есть ли способ хранить указатели зарегистрированных структур без необходимости динамического выделения объектов Entry? Или мне следует придерживаться этого решения и просто создать фиксированный пул памяти, который я смогу безопасно выделить?
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Постоянная ошибка выражения, когда постоянная функция вызывается из другой
Anonymous » » в форуме C++ - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Постоянная ошибка выражения, когда постоянная функция вызывается из другой
Anonymous » » в форуме C++ - 0 Ответы
- 2 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Проблема с распределением памяти с помощью LazyVGrid SwiftUI при отображении медиафайлов
Anonymous » » в форуме IOS - 0 Ответы
- 41 Просмотры
-
Последнее сообщение Anonymous
-