Явная реализация класса для не шаблонных классов - PullRequest
0 голосов
/ 06 июня 2018

В C ++ вы можете явно создать экземпляр шаблонного класса, например так:

template class A<B>;

Это вынуждает компилятор включать все методы этого класса в свой вывод, что очень полезно для оценки того, какие из них покрытыtests.

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

Ответы [ 2 ]

0 голосов
/ 15 июня 2018

Мне не удалось найти решение, работающее с динамическими ссылками (причина, по которой я пишу библиотеки только для заголовков, заключается в том, что я ненавижу линкеры с пылкой страстью), но по пути я обнаружил некоторые встроенные опции компилятора в Clangсделал то, что я хочу.Я добавил флаги -fprofile-instr-generate -fcoverage-mapping в свою компиляцию, а затем использовал llvm-profdata и llvm-cov для просмотра покрытия теста (как описано здесь ).

Примечание для всех, кто пытается выполнить эту работу: обязательно используйте одну и ту же версию llvm для всех трех этих команд (clang, llvm-profdata и llvm-cov).

0 голосов
/ 06 июня 2018

Нет концепции создания экземпляров с не шаблонными классами.Когда компилятор встречает определение функции-члена, определение компилируется сразу.

Независимо от того, выводится ли функция в двоичном файле, зависит от компилятора и ваших настроек.Если вы скомпилируете свою программу как библиотеку, все функции будут реализованы.Если вы используете статическое связывание, компоновщик не добавит неиспользуемые функции в ваш двоичный файл.

Напротив, если вы используете динамическое связывание, все экспортированные определения будут там.Хотя неэкспортированная функция, такая как функция со статическим связыванием, может быть встроена без отдельного определения.

Независимо от того, были ли они фактически сохранены и выведены в двоичный файл, это нечто отдельное от самой компиляции.Например, вы можете создать 100 шаблонных функций, и в действительности ни одна из них не будет выведена в двоичном виде.Это зависит от компоновщика, если ваша функция перейдет в двоичный файл.

Если ваша функция является общедоступным символом, она, вероятно, попадет в двоичный файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...