Я экспериментировал с некоторыми шаблонами программирования в проводнике компилятора, когда заметил, что MSVC оставил множество шаблонных определений функций в выводе сборки, даже если они были оптимизированы из основной функции и не вызывались ни в какой момент;это в отличие от GCC, который не включает их.Я проверил, используя мою установку Visual Studio 2019 (16.1.3), и результат такой же, как у проводника компилятора.
Существуют ли комбинации компилятор и компоновщик флаги или директивы, которые я могу дать в источнике, который удалит их из двоичного файла?Я пробовал комбинации, включающие / O1, но безрезультатно.
Код , который я использовал, является
template <unsigned int N>
constexpr unsigned int fact()
{
return N * fact<N-1>();
}
template <>
constexpr unsigned int fact<0>()
{
return 1;
}
int main()
{
return fact<4>();
}
Выход GCC
main:
mov eax, 24
ret
и из MSVC
unsigned int fact<1>(void) PROC ; fact<1>, COMDAT
mov eax, 1
ret 0
unsigned int fact<1>(void) ENDP ; fact<1>
etc...
unsigned int fact<4>(void) PROC ; fact<4>, COMDAT
mov eax, 24
ret 0
unsigned int fact<4>(void) ENDP ; fact<4>
unsigned int fact<0>(void) PROC ; fact<0>, COMDAT
mov eax, 1
ret 0
unsigned int fact<0>(void) ENDP ; fact<0>
main PROC ; COMDAT
mov eax, 24
ret 0
main ENDP
, тогда как я надеюсь найти способ для него просто испустить
main PROC ; COMDAT
mov eax, 24
ret 0
main ENDP