Всякий раз, когда класс содержит хотя бы одну виртуальную функцию, компилятору необходимо добавить информацию о типе RunTime для каждого из объектов. Реализация обычно добавляет один указатель на каждый объект, который ссылается на структуру, определенную компилятором и скрытую от пользователей, с указателем на объект type_info
и vtable
, используемым для динамической отправки функций.
В случае класса без нестатических элементов данных и, по крайней мере, одной виртуальной функции, размер каждого объекта равен размеру информации RTTI для каждого объекта (один указатель), и потому что это ненулевое значение , компилятор не будет добавлять дополнительное пространство. Цитата говорит, что sizeof(T) != 0
для любого и всех типов T
, и тип с динамической функцией тривиально соответствует этому требованию. Только с типами, которые имеют нулевой размер, компилятор вынужден увеличивать объект на 1 символ.