Я создал класс, который выглядит как массив, но вместо того, чтобы хранить данные в самой программе, он передает байт из файла (чтобы уменьшить влияние ОЗУ). Теперь у меня есть все это работает, но программист должен определить класс, используя следующее:Создание параметров шаблона во время компиляции
#define CreateReadOnlyBlock(name, location, size, ...) \
template<> \
const unsigned int ReadOnlyBlock<location, size>::Data[] \
__asm__(".readonly__" #location "__" #name) \
= { __VA_ARGS__ }; \
ReadOnlyBlock<location, size> name;
Пример:
//A read only array of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray, 0, 4, 0, 1, 2, 3);
Обратите внимание, что это для встроенного процессора, и директива ASM проходит через инструмент в ассемблере для создания файла только для чтения.
Итак, вот мой вопрос: как я могу устранить переменные «местоположение» и «размер»? Я ненавижу, что программисту приходится вводить их вручную, и он предпочитает какой-то способ генерации данных во время компиляции. Таким образом, вместо программиста необходимости печатать:
//A read only array at location 0 of {0, 1, 2, 3}
CreateReadOnlyBlock(readOnlyArray1, 0, 4, 0, 1, 2, 3);
//A read only array at location 4 of {4, 5, 6, 7}
CreateReadOnlyBlock(readOnlyArray2, 4, 4, 4, 5, 6, 7);
Они могли бы просто напечатать:
CreateReadOnlyBlock(readOnlyArray1, 0, 1, 2, 3);
CreateReadOnlyBlock(readOnlyArray2, 4, 5, 6, 7);
И соответствующие константы будут генерироваться. В основном я ищу способ генерации и размещения этих констант на основе предыдущих определений во время компиляции. C++ 11 - честная игра, я просто не очень хорошо знаком с ней (что-то с constexpr кажется правдоподобным?). Кроме того, C-Preprocessor тоже в порядке, если он не делает его более уродливым, чем он есть. Это возможно?
EDIT для ясности:
В классе ReadOnlyBlock есть этот метод:
template<const int _location, const int _size> class ReadOnlyBlock
{
...
unsigned int operator[] (size_t index)
{
return LoadFromROM(index + _location);
}
}
Существует внутренняя взаимозависимость между переменным местоположением и файлом ROM, который я не могу думать о том, как сломать. I do также имеют полный контроль над цепочкой инструментов, но мне нужен способ передать инструмент ассемблера, как построить файл, а также указать код C++, где блоки лежат в файле.
Другой EDIT:
файл и его блоки могут быть довольно большой, так же, как 1k слова, так много препроцессора магии может рухнуть при условии, что. Кроме того, спасибо всем за помощь до сих пор!
Параметр '# location' в части '__asm__' действительно убивает его. Вам действительно нужно это, или вы будете довольны решением всего остального? –
Размер прост, но для местоположения потребуется контекст. Создание экземпляра шаблона является функциональным языком, и результат создания может варьироваться только в зависимости от того, что вы передаете. Если вы связываете такие блоки или создаете память в одном большом шаблоне, это может быть сделано. Т.е. создайте «кортеж» только для чтения массивов, каждый из которых имеет местоположение и размер, начиная с некоторого места и упаковывая. – Yakk
Так что, возможно, я должен был включить причину этого. Перегруженный оператор [] в классе ReadOnlyBlock вызывает LoadFromROM (индекс + местоположение); Инструмент создает файл только для чтения, который имеет каждый блок в каждом указанном месте, и класс знает, что нужно загрузить с этого места. Я не могу придумать способ устранить эту взаимозависимость, но у меня есть полный контроль над инструментом, а также код доступа, поэтому его изменение не может быть и речи. –