по-моему вы всё же не те яблоки с апельсинами сравниваете. мы в итоге имеем 3 варианта реализации, в зависимости от того, можно ли заинлайнить тело визитора: полностью локальный, с goto, полностью локальный с if, и вариант с call
бенчмарк просто показывает что этот оверхед ничтожен в любой мало-мальски нетривиальной логике, где доминирует в итоге вызов функции или переход по адресу вне instruction cache
Вопрос к знатокам, это я где-то ub тригерю или баг нашел? Суть: две функции, отличаются только типом индекса в цикле, при этом дают разные результаты, функция с short типом не обрабатывает 3 ий элемент. Поведение проявляется только под clang на -O3 флаге. Асемблерный код цикла получается разным. https://godbolt.org/z/5vvGnf
впрочем, можно притянуть за уши и сказать, что union (или любой другой storage) сам по себе не знает хранимый тип, поэтому мы стираем тип и кладём его индекс в отдельную переменную
впрочем, можно притянуть за уши и сказать, что union (или любой другой storage) сам по себе не знает хранимый тип, поэтому мы стираем тип и кладём его индекс в отдельную переменную
ничего он не стирает, тип из соседней шаред либы не приедет
Разве variant это type erasure? Я считал, что type erasure это any и function.
ну речь о том что если ты будешь делать variant (или нечто подобное) вручную ты будешь хранить объект в виде абстрактного буфера и некоторого значения, указывающего тип объекта в этом буфере
ну речь о том что если ты будешь делать variant (или нечто подобное) вручную ты будешь хранить объект в виде абстрактного буфера и некоторого значения, указывающего тип объекта в этом буфере
Для меня ключевой характеристикой type erasure является то, что он может хранить неограниченное множество типов.