C ++编译器是否为每个模板类实例生成具有相同模板参数集的代码?

时间:2017-08-11 12:07:23

标签: c++ templates template-meta-programming

不要考虑众所周知的编译时递归斐波纳契计算。在这种特殊情况下,实例化fibonacci<1>(或fibonacci<20>无关紧要多少次?它只是一次吗?如果是,编译器会为我们执行动态编程算法:)

    template<int n>
    struct fibonacci
    {
        static const uint64_t value = fibonacci<n - 1>::value + fibonacci<n - 2>::value;
    };

    template<>
    struct fibonacci<0>
    {
        static const  uint64_t value = 0;
    };

    template<>
    struct fibonacci<1>
    {
        static const uint64_t value = 1;
    };

    int main()
    {
        std::cout << fibonacci<80>::value;
    }

让我们考虑另一个例子。

    int main()
    {
        std::vector<int> v1;
        std::vector<int> v2;
    }

C ++编译器是否为vector<int>的两个实例生成单独的代码? 如果vector<int>的类似实例位于不同的翻译单元中会怎样?

2 个答案:

答案 0 :(得分:3)

C ++标准不强制要求其中一个。只要完成的程序按指定行为运行,编译器就可以执行任何操作,请参阅所谓的“as-if”规则(第1.9-1节)。一个好的编译器不会生成不必要的代码,所以我希望它将fibonacci示例优化为常量,并将矢量示例优化为矢量函数的一个实现。

答案 1 :(得分:0)

  

在这种特定情况下,斐波那契1的次数是多少。 (或斐波纳契20无关紧要)被实例化了吗?

零对象,只有静态(const!)值。

std::vector<int> v1;
std::vector<int> v2;

实例化两个对象。