Это очень специализированный оптимизированный корпус для видеоигр (в основном встроенная система). Раньше мы использовали их для поведения данных «Загрузка на месте» в наших видеоиграх, чтобы ускорить загрузку (и избежать фрагментации).
По сути, мы создаем объекты на стороне консоли (Playstation) в варочном устройстве для ПК. Затем, чтобы уменьшить перегрузку фрагментацией, мы упаковываем объекты данных в непрерывный буфер с помощью одного alloc. Затем ссылки на объекты данных в этом буфере будут изменены, чтобы вычесть базу из указателей на смещения (вызов unfix — у нас также были виртуальные вызовы fix/unfix, которые брали базу буфера и могли конвертировать между смещениями и указателями).
Когда мы загружали данные, они загружались одним большим блоком. Все данные, на которые ссылается корень, были вне корневого объекта. Мы могли бы сделать «новое» на месте в корне, которое инициализировало бы правильные таблицы VF для объекта и исправило бы все присоединенные блоки (выполнив новое на месте, а затем исправив присоединенные блоки соответственно).
Нам нужны были вызываемые конструкторы (вместо новых) для создания правильных VF-таблиц в объектах. Однако если бы указатели были автоматически очищены до NULL во время конструктора, мы бы потеряли данные смещения и не смогли бы воссоздать указатели между объектами в непрерывном блоке.
FWIW, это обычная техника в мире видеоигр. Эта статья Gamasutra (не написанная мной или моими коллегами) объясняет в подробно опишите то же самое, что они сделали в другой компании:
Кроме того, эта тема обсуждения на SourceForge.
Было даже проведено несколько выступлений на GDC (Конференция разработчиков игр) на эту тему.
Поиск в Google по запросу «загрузка на месте» даст много других примеров людей, использующих этот метод, который в основном требует неинициализированных указателей.
ПРИМЕЧАНИЕ. В настоящее время это единственный ответ, который фактически отвечает на заданный вопрос («Есть ли применение для неинициализированных указателей в C или C++?»), Указав конкретное использование указателей, которые должны оставаться унитаризированными.
Все остальные ответы являются лучшими ответами на исходный вопрос, на который ссылается («[C++] Почему указатели не инициализируются NULL по умолчанию?»), что заставило автора задать этот вопрос.
person
Adisak
schedule
15.12.2009