tgoop.com/experimentalchill/283
Last Update:
Compressed pair
В стандартной библиотеке C++ множество контейнеров принимают allocator<A>, который по дефолту занимает 0 байт. Но в C++ не могут быть структуры (в отличие от C) с sizeof равным нулю. Значит элементами класса их не сделать бесплатно. В итоге приходилось использовать Empty Base Optimization, когда наследование от класса с нулевым размером оптимизируется в void.
Чтобы это как-то унифицировать, в libc++ сделали compressed_pair<A, B>, чтобы можно было писать члены класса и зафиксировать ABI. Делали A каким-то нужным полем, а B, например, аллокатором, тем самым sizeof сохранялся.
В C++20 добавили атрибут [[no_unique_address]], который запрещает адресоваться к структурам размера ноль, а если более точно, то при попытке так сделать даст какой-то адрес какого-то члена класса.
Спустя 4 года завезли в libc++ и заменили compressed_pair. Патч тащили 9 месяцев, потому что поломалось всё в дебагерах. Дотащили, дебаг символы в хромиум уменьшились на 5%, компиляция ускорилась на 1-1.5%, что не может не радовать.
https://github.com/llvm/llvm-project/pull/76756
BY Experimental chill
Share with your friend now:
tgoop.com/experimentalchill/283