MSVC留下的冗余模板实例

时间:2019-06-21 08:22:43

标签: c++ templates visual-c++

当我注意到MSVC在程序集输出中留下了许多模板化函数定义时,尽管它们是在主函数之外进行了优化并且在任何时候都未调用,但我在编译器浏览器上进行了一些模板编程的实验;这与不包含它们的GCC相反。我使用Visual Studio 2019(16.1.3)进行了安装检查,其输出与编译器资源管理器的输出相同。

我是否可以在源代码中提供compilerlinker标志的组合,或者将它们从二进制文件中删除的指令?我尝试了涉及/ O1的组合,但无济于事。

code I used is

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

0 个答案:

没有答案