2013-05-28 3 views
32

Что такое виртуальный метод и почему он влияет на время ссылки?Внештатный виртуальный метод

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

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

+1

https://hadesmem.googlecode.com/svn-history/r1840/trunk/include/memory/hadesmem/error.hpp –

ответ

34

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

Смежные вопросы