В частности, в однопоточных диалектах языка Си, которые не используют агрессивно-ориентированный анализ псевдонимов, иногда полезно написать диспетчеры памяти, которые могут приспосабливать перемещаемые объекты. Вместо того, чтобы давать приложениям прямые указатели на фрагменты памяти, приложение получает указатели в таблицу дескрипторов дескрипторов, каждый из которых содержит указатель на фактический фрагмент памяти вместе со словом, указывающим на его размер. Если нужно выделить место для struct woozle
, можно сказать:
struct woozle **my_woozle = newHandle(sizeof struct woozle);
и затем доступ (несколько неловко в синтаксисе C - синтаксис чище в
Паскаль): (* my_woozle) -> someField = 23; важно, чтобы приложения не
держать прямые указатели на цель любого дескриптора через вызовы функций, которые
выделить память, но если существует только один указатель на каждый блок
идентифицированный дескриптором менеджер памяти сможет перемещать вещи
в случае, если фрагментация станет проблемой.
Подход не работает почти так же хорошо на диалектах Си, которые агрессивно
использовать псевдонимы на основе типов, поскольку указатель, возвращаемый NewHandle
, не
идентифицировать указатель типа struct woozle*
, но вместо этого идентифицирует указатель
типа void*
и даже на платформах, где эти типы указателей будут иметь
то же представление стандарт не требует, чтобы реализации
интерпретировать приведенный указатель как указание на то, что следует ожидать, что псевдонимы
может произойти.