Резервные экземпляры шаблонов, оставленные MSVC - PullRequest
2 голосов
/ 21 июня 2019

Я экспериментировал с некоторыми шаблонами программирования в проводнике компилятора, когда заметил, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...