Как можно предварительно инициализировать структуры данных в памяти для программ на основе ПЗУ? - PullRequest
0 голосов
/ 28 июня 2018

Рассмотрим STL unordered_map. Один и тот же класс шаблона используется как для хеш-таблиц, генерируемых во время выполнения, так и для хеш-таблиц, состоящих из значений констант времени компиляции. Хотя в последних версиях C ++ добавлена ​​поддержка constexpr, она не распространяется на более сложные операции, включающие свободное хранилище, поэтому построение хеш-таблицы из констант времени компиляции должно все же происходить во время выполнения, что делает его столь же дорогим, как и создание любой другой хеш-таблицы в во время выполнения.

В идеале идеальный компилятор должен видеть это и предварительно оценивать конструкцию хеш-таблицы во время компиляции и встраивать ее непосредственно в программу.

Это заставило меня задуматься о ретрокомпьютерах и микроконтроллерах, которые, по-видимому, написали бы свое программное обеспечение на C или C ++, учитывая стоимость разработки сборки: эти среды часто имеют ограниченную оперативную память, но много ПЗУ, и такие структуры данных в памяти (такие как unordered_map), конечно, может быть предварительно сгенерирован и сохранен в ПЗУ все во время компиляции.

Как уже упоминалось, язык C ++ не поддерживает это для нетривиальных constexpr. Я понимаю, что вы могли бы взломать это вместе, предполагая, что вы можете основать свою сложную структуру данных на типе массива или уменьшить ее до constexpr - или записать все это в сборке и вручную установить каждый байт структуры в hex-редакторе и надеюсь, что оно соответствует представлению компилятора ваших struct типов (например).

Как это делается сегодня? И как это было сделано во времена 16-битных и 32-битных игровых приставок, где такты ОЗУ и ЦП были выше? Я особенно заинтересован в том, чтобы узнать об играх на основе ROM-картриджей, где структуры сразу доступны в виде необработанной памяти.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

В микроконтроллерных системах C ++ все конструкторы объектов со статической длительностью хранения вызываются во время загрузки, около точки, где инициализируются сегменты .data и .bss и т. Д., Перед вызовом main (). Это одна из нескольких причин, почему C ++, как правило, не подходит для таких систем - он фактически выполняет код приложения на этапе запуска.

Тип приложений, о которых вы упоминаете, например старые видеоигры, скорее всего, таблицы были предварительно рассчитаны и записаны в ПЗУ. Я сомневаюсь, что C ++ широко использовался для таких игр, или, если это было так, они использовали ограниченный поднабор языка.

0 голосов
/ 28 июня 2018

unordered_map - это крайне неэффективный тип структуры данных, который вы никогда не будете использовать в подобных условиях. Более разумные вещи, такие как массивы и деревья, легко сделать с помощью статических инициализаторов. Если это усложняется, вы пишете программу для генерации C, содержащую требуемые статические инициализаторы, и запускаете ее в системе, которая может это обработать.

...