TGViewer
Experimental chill Experimental chill @experimentalchill · 9.22K subscribers
Post #288 18.4K
Trivially relocatable

В C++ есть большая группа людей (включая меня), которая любит брать оптимизации из C -- mem* функции возможно являются сильнейшим преимуществом C перед многими другими языками в перформансе. В C++ об этом думали и делали аттрибут std::trivially_copyable, который разрешает копировать как memcpy. Отлично работает на примитивных структурах и в целом C++ такой быстрый в том числе и из-за этого.

Но бывают и более интересные кейсы. Когда вы добавляете элементы в std::vector, рано или поздно вам надо будет реаллоцировать. Вы будете копировать числа/делать std::move объектов из предыдущего вектора. В ситуации с числами можно звать memcpy, они тривиальны, всё отлично. Но на самом деле звать memcpy можно и не только на тривиально копируемые типы, а, например, на unique_ptr<T>, или QString (который с ref count), или vector<int>!

Ведь копирование указателей, чисел вида размера/вместимости при тривиальном std::move ни к чему плохому не приведёт. К сожалению, по стандарту так нельзя. Когда вы начинаете делать mem* функции на типы, у которых примитивный std::move, то стандарт ничего для этого не приготовил и только говорит, что вы обязаны вызвать деструктор, и memcpy не позволяет начать жизнь более сложных объектов.

Поэтому в последние лет 6 идёт борьба за то, чтобы внести понятие тривиально релоцируемых типов -- у которых move оператор и move конструкторы устроены так, что это просто копирование по битам. Если быть точным, нужно ещё, чтобы деструктор не делал странных вещей, например, ничего не делал для пустых векторов, нулевых указателей и тд.

Без этого вставки в середину вектора, удаления из векторов долго не могли использовать memcpy тоже для таких типов. Существует ряд оптимизаций, который открывается из этого. В том числе interop с Rust станет слегка попроще :)

6 лет бились (первые года 4 не сильно, комитету в целом нравилось предложение), и таки уехало в феврале этого года в C++26.

Есть отличный блог из 5 небольших частей почитать о том, как это устроено в Qt.

Сам пропозал
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2025/p2786r13.html#abstract
KDAB Qt and Trivial Relocation (Part 1): What is relocation? | KDAB Discover how Qt optimizes container operations with byte-level manipulations, including trivial relocation for types like int and QString.
  • 🔥 159
  • ❤ 33
  • 👍 20
  • 🤔 5
  • 🌭 2
  • 😐 2
  • 🙉 2
  • 👏 1
More from @experimentalchill
  1. Sep 2, 2025Latency profiler Представьте ситуацию, вы пишете код на Python, вызываете посередине библи…
  2. May 15, 2025Size based vector https://discourse.llvm.org/t/adding-a-size-based-vector-to-libc-s-unstab…
  3. Apr 23, 2025Сегодня про закон Литтла. Недавно очень много читал про теорию очередей — это математика т…
  4. Mar 25, 20251. Объявили результаты TON: дали серебро, оказался 6-7 по топу (Mindful Kitten), дали $500…
  5. Feb 5, 2025January update (старею) 1. Мой (первый) стажёр из Яндекса опубликовал Perforator — сборщик…
  6. Jan 12, 2025Compressed pair В стандартной библиотеке C++ множество контейнеров принимают allocator<A>,…
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 →