Sizeof от std :: function & lt; void (int & amp;) & gt; тип

Какую магию делает std::function<void(int&)> из C ++ 11, что его sizeof = 32? Если бы я сохранил ссылку на функцию в качестве указателя, это стоило бы только 8 bytes (на 64-битной машине).

20

Решение

За std::function<Signature> это компромисс между размером объекта и распределением, который интересен: для небольших функциональных объектов желательно избегать распределения. С другой стороны, это увеличивает размер объекта. Чтобы небольшая оптимизация функции была полезной и не вызывала накладных расходов при фактическом вызове объекта, размер объекта должен составлять не менее двух указателей плюс некоторое количество памяти для хранения простых функциональных объектов. Кажется, что размер 32 байта именно это (в системе, где sizeof(T*) это 8).

То есть внутренне std::function<Signature> объект хранит иерархию наследования: базовый класс предоставляет вызываемый интерфейс, делегируя шаблонному производному, который реализует интерфейс вызова (плюс, возможно, некоторые clone() функциональность). В реализации, оптимизированной по размеру, объект функции просто сохранит указатель на базу, но во избежание выделения он выделит некоторое внутреннее хранилище для выделения всего объекта и указания на этот объект (внутренний указатель избегает условия при фактическом вызове объект функции). Память, необходимая для объекта, представляет собой указатель виртуальной функции плюс любые данные для фактического объекта функции. std::function<Signature> Объект инициализируется с. Чтобы приспособить функции-члены к их объекту, кажется, что еще два слова достаточно малы.

15

Другие решения

std::function действительно волшебство, так как оно может быть построено из любой вызываемый объект! Он с радостью сохранит любое количество состояния для вас, даже если на поверхности вы сохраните жалкое void(int&) подпись.

Конечно, к этой магии привязана цена, которая обычно использует какое-то стирание типа (то есть динамическое распределение и виртуальная диспетчеризация) внутри. Детали различаются, но получающиеся объекты, безусловно, «тяжелые» — поэтому их следует избегать в пользу auto и шаблоны, когда это возможно!

8

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector