Альтернативные схемы реализации vptr?

Это вопрос не о самом языке C++(, т.е. не о Стандарте), а о том, как вызвать компилятор для реализации альтернативных схем для виртуальной функции.

Общая схема реализации виртуальных функций заключается в использовании указателя на таблицу указателей.

class Base {
     private:
        int m;
     public:
        virtual metha();
};

то же самое, скажем, C будет чем-то вроде

struct Base {
    void (**vtable)();
    int m;
}

первый элемент обычно является указателем на список виртуальных функций и т. д. (часть области памяти, над которой приложение не имеет никакого контроля). И в большинстве случаев это происходит из-за размера указателя до рассмотрения членов и т. д. Таким образом, в 32-битной схеме адресации около 4 байтов и т. д. Если вы создали список из 40 тыс. полиморфных объектов в своих приложениях, это около 40 тыс. x 4 байта = 160 КБ перед любыми переменными-членами и т. д. Я также знаю, что это самая быстрая и распространенная реализация среди компиляций C++.

Я знаю, что это осложняется множественным наследованием (, особенно с виртуальными классами в них, т.е. алмазной структурой и т. д.).

Альтернативный способ сделать то же самое — использовать первую переменную в качестве идентификатора индекса для таблицы vptrs(, эквивалентной в C, как показано ниже.)

struct Base {
    char    classid;     // the classid here is an index into an array of vtables
    int     m;
}

Если общее количество классов в приложении меньше 255(включая все возможные экземпляры шаблонов и т. д. ), тогда char достаточно хорош для хранения индекса, тем самым уменьшая размер всех полиморфных классов в приложении (Я исключаю проблемы с выравниванием и т. д. ).

У меня вопрос: есть ли какой-либо переключатель в GNU C++, LLVM или любом другом компиляторе для этого?? или уменьшить размер полиморфных объектов?

Изменить:Я понимаю указанные проблемы с выравниванием. Также еще один момент,если бы это было в 64-битной системе(, предполагающей 64-битный vptr)с каждым членом полиморфного объекта, занимающим около 8 байтов, тогда стоимость vptr составляет 50% памяти. В основном это относится к небольшим полиморфам, созданным в массе, поэтому мне интересно, возможна ли эта схема хотя бы для конкретных виртуальных объектов, если не для всего приложения.

7
задан curiousguy 28 June 2018 в 02:43
поделиться