Вместо того, чтобы выбирать одно магическое число, вы должны использовать случайное число (предпочтительно, по крайней мере, с одним из 8 младших битов - вы можете форсировать это, например, с помощью ИЛИ в 1) или некоторую константу - ваш выбори затем XOR это (^) с адресом (например, адрес, который вы проверяете).Такой подход значительно сократит вероятность случайного столкновения.
Например, когда вы пишете заголовок объекта (или заголовок страницы, в зависимости от типа используемого вами распределителя), сохраняйте MAGIC ^ addr
.Теперь, когда вы хотите проверить, является ли addr
действительным, просто посмотрите, если value == addr ^ MAGIC
(с соответствующими приведениями, конечно).
Кстати, прежде чем приступать к созданию собственного распределителя памяти, пожалуйста, прочитайтеэта статья ( Пересмотр пользовательского распределения памяти , автор Berger, Zorn и McKinley), из OOPSLA 2002.
http://www.cs.umass.edu/~emery/pubs/berger-oopsla2002.pdf
Аннотация: Программистыв надежде на улучшение производительности часто используют пользовательские распределители памяти.В этом углубленном исследовании рассматриваются восемь приложений, использующих пользовательские распределители.Удивительно, что для шести из этих приложений современный распределитель общего назначения (распределитель Lea) работает так же хорошо или лучше, чем пользовательские распределители.В двух исключениях используются регионы, которые обеспечивают более высокую производительность (улучшение до 44%).Регионы также уменьшают нагрузку на программиста и устраняют источник утечек памяти.Однако мы показываем, что неспособность программистов освободить отдельные объекты внутри регионов может привести к значительному увеличению потребления памяти.Хуже того, это ограничение исключает использование областей для общих идиом программирования, снижая их полезность.Мы представляем обобщение универсальных и региональных распределителей, которые мы называем пожинаниями.Рипы представляют собой комбинацию областей и куч, обеспечивая полный диапазон семантики областей с добавлением удаления отдельных объектов.Мы показываем, что наша реализация reaps обеспечивает высокую производительность, опережая другие распределители с региональной семантикой.Затем мы используем пример из практики, чтобы продемонстрировать космические преимущества и преимущества программной инженерии, которые можно использовать на практике.Наши результаты показывают, что программисты, которым нужны быстрые регионы, должны использовать reaps, и что большинство программистов, рассматривающих пользовательские распределители, должны вместо этого использовать распределитель Lea.