Подтвердить что ты не робот

Внештатный виртуальный метод

Что такое виртуальный метод out-of-line и почему он влияет на время ссылки?

http://llvm.org/docs/CodingStandards.html говорит

Если класс определен в файле заголовка и имеет таблицу vtable (либо она имеет виртуальные методы или они происходят из классов с виртуальными методами), это должен всегда иметь по крайней мере один виртуальный метод вне класса в классе. Без этого компилятор скопирует vtable и RTTI в каждый .o файл, который # включает заголовок, раздувание размеров файла .o и увеличение время ссылки.

4b9b3361

Ответ 1

Компилятор должен выпустить vtable для классов с виртуальными методами. Это содержит указатели на эти методы. Если все виртуальные методы являются встроенными (определены в заголовке), то компилятор не знает, какую единицу перевода (файл .cpp) испускает vtable внутри, поэтому он испускает копию во всех из них, и компоновщик получает дело с этим. Это делает дополнительную работу и раздувание в объектных файлах. Если, с другой стороны, виртуальная функция определена вне линии (в .cpp), vtable может быть испущена там, и, таким образом, будет выпущена только одна копия. То же самое относится к RTTI.