Я обнаружил что-то странное в компиляторе MSVC.
определение шаблона функции помещается в сборку, а оптимизация устраняет необходимость в них. Кажется, что Clang и GCC успешно удаляют определение функции, а MSVC — нет.
Можно ли это исправить?
main.cpp:
#include <iostream>
template <int n> int value() noexcept
{
return n;
}
int main()
{
return value<5>() + value<10>();
}
сборка:
int value<5>(void) PROC ; value<5> COMDAT
mov eax, 5
ret 0
int value<5>(void) ENDP ; value<5>
int value<10>(void) PROC ; value<10> COMDAT
mov eax, 10
ret 0
int value<10>(void) ENDP ; value<10>
main PROC ; COMDAT
mov eax, 15
ret 0
main ENDP
Это просто из-за того, как godbolt компилирует код (я думаю, он не полностью компилируется для MSVC). Если вы компилируете с помощью MSVC на своем компьютере в режиме «Выпуск», этих функций также не существует.
с переключателем
/GL
компилируется вmov eax,0xf ret
@ChrisMM Я попробовал на своей локальной машине, и результат тот же!
Какие настройки вы используете? Режим «Выпуск» по умолчанию в VS 2022 не имеет для меня этих функций....
@IłyaBursov Я тоже пробовал, но обе функции доступны в сборке!
@ChrisMM Я скомпилировал код с использованием VS 2022 со следующими флагами: -arch:AVX -O2 -GR- -FA
Как вы смотрите на сборку?
@ChrisMM, используя флаг -FA, VS создает main.asm, и вы можете его прочитать.
Это не оптимизированный/полностью скомпилированный файл сборки...
@ChrisMM Итак, как вы просматриваете ассемблерный код?
Дубликат избыточных экземпляров шаблона, оставленных MSVC. (на который нет ответа)