Это вопрос не о самом языке 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% памяти. В основном это относится к небольшим полиморфам, созданным в массе, поэтому мне интересно, возможна ли эта схема хотя бы для конкретных виртуальных объектов, если не для всего приложения.