当我注意到MSVC在程序集输出中留下了许多模板化函数定义时,尽管它们是在主函数之外进行了优化并且在任何时候都未调用,但我在编译器浏览器上进行了一些模板编程的实验;这与不包含它们的GCC相反。我使用Visual Studio 2019(16.1.3)进行了安装检查,其输出与编译器资源管理器的输出相同。
我是否可以在源代码中提供compiler和linker标志的组合,或者将它们从二进制文件中删除的指令?我尝试了涉及/ 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