* Решение Кладова может себе позволить хранить интернированные строки, как
u32. Моё же решение вынуждено использовать указатель размером минимум с usize, что на большинстве используемых систем — 64-битных — более * Достоинство в виде привязки времени жизни к пулу строк одновременно является и недостатком: хранить пул строк и выделенные им строки в одном типе невозможно.
* Из-за выравнивания выделенной памяти под выравнивание
usize на каждую строку есть переменный оверхед по памяти от нуля до семи (на 64-битных системах) байтов. С другой стороны, оверхед по памяти также есть и потому, что строки почти наверняка не будут укладываться в чанки тютелька в тютельку в обоих решениях, а также потому, что мапы и так имеют оверхед по памяти для вставки значений in-place, поэтому это навряд ли имеет большое значение. С третьей стороны, моё решение позволяет переиспользовать память, поэтому на практике при многократном использовании пула строк с относительно одинаковым суммарным размером строк в какой-то момент мой подход остановится на одном внутреннем чанке внутри Bump.* Не совсем понятно, насколько корректной является реализация
PartialEq для InternedStr. С одной стороны, интернированные строки используют в том числе для того, чтобы сравнение строк выполнялось за константное время. С другой стороны, сравнение InternedStr, полученных из разных пулов, может дать ложно-отрицательный результат. Это можно пофиксить, добавив ручную реализацию PartialEq, которая будет сравнивать сначала ptr, а в случае их неравенства сравнивать результаты возврата .as_str(), но тогда теряется гарантия константного сравнения. Ловушка тихо неверных результатов или ловушка тихо непроизводительных результатов — что хуже? Если подходить с точки зрения, что API нужно дизайнить для pit of success (как это часто и бывает в std) и корректность превыше всего, то нужно делать сравнение с фоллбеком. Если же подходить с точки зрения производительности как требования к API, то нужно оставлять выведенную реализацию PartialEq. У меня нет ответа на этот вопрос, но сделать сравнение строк из разных пулов можно усложнить, сделав InternedStr инвариантным по лайфтайму.Вот и всё, как всегда, весь код в гисте.