TGViewer
Блог* Блог* @dereference_pointer_there · 1.99K subscribers
Post #10640 1.22K
Теперь поговорим о недостатках этого решения:

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

Вот и всё, как всегда, весь код в гисте.
  • ❤ 4
  • 👍 3
More from @dereference_pointer_there
  1. Oct 10, 2026#prog #article HTTP is not simple От Daniel Stenberg, автора curl
  2. Oct 10, 2026#article RISC-V: They Should Have Known Better Несколько эмоциональная статья о недостатка…
  3. Oct 9, 2026#prog #rust #meme Было в r/rustjerk, но сначала выложили в r/ClaudeCode
  4. Oct 9, 2026Welp
  5. Oct 9, 2026#prog #article Оттуда: The case against JPEG XL
  6. Oct 9, 2026#prog #article Shipping JPEG XL in Chrome Но в треде на r/rust пишут, что есть сомнения в…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →