代码之家  ›  专栏  ›  技术社区  ›  Tom Huntington

类模板实例化的数量

  •  1
  • Tom Huntington  · 技术社区  · 2 年前

    我想知道您是否应该担心类模板实例化的数量及其对编译时间的影响。在下面的例子中, 我设想Foo模板只会实例化一次 ,而Bar模板将被实例化两次。这种差异对STL作者来说重要吗?

    template<unsigned SIZE>
    struct Foo
    {
        const unsigned size_;
        Foo() : size_(SIZE) {}
    };
    
    Foo<1> foo1;
    Foo<2> foo2;
    
    template<unsigned SIZE>
    struct Bar
    {
        static constexpr unsigned size_{SIZE};
    };
    
    Bar<1> bar1;
    Bar<2> bar2;
    

    我觉得我对Foo模板只实例化一次是错误的。如果是的话,你能告诉我

    Bar<1> bar1;
    Bar<1> bar2
    ...
    Bar<1> bar10000;
    

    将实例化 Bar 模板一次或10000次。

    类模板实例化类型,类型实例化对象,如果实例化的对象数量保持不变,那么减少实例化类型的数量是否重要?

    这些事情甚至与编译时间有关吗(我怀疑它们是否符合我的目的)

    2 回复  |  直到 2 年前
        1
  •  2
  •   Fantastic Mr Fox    2 年前

    因此,简单的答案是,对于您正在创建的每个类型,都会生成模板代码(以及随后的编译)。所以在这个例子中:

    Bar<1> bar1;
    Bar<1> bar2
    ...
    Bar<1> bar10000;
    

    每个都是类型 Bar<1> 所以您只需要为生成代码 条形图<1> 一旦你可以在中看到这个 cpp insights tool .

    但是,如果您在整个代码库中使用它,这种情况就会改变。请记住,包含此标头的每个转换单元(有点类似于cpp文件)都将重新定义类型 Bar Foo 用于与之一起使用的任何数字。如果是这种情况,您可能会发现您的代码被大量生成和编译。对于这个不值得关注的简单模板,但对于可能依赖于其他模板的更复杂的模板,这可能会很快累积起来。

        2
  •  -1
  •   murugesan openssl    2 年前

    实际上,您正在创建对象: 条形图<1>bar1; 条形图<1>bar2 ... 条形图<1>bar10000; 10000次=>在运行时实例化。不是在编译时。 编译器用于编译、检查编程、创建可执行文件。 一旦编译后没有任何错误,在执行过程中,将根据代码流创建对象。在创建对象时处理内存管理,以处理运行时的性能问题(如果有的话)。 您可以通过以下方式识别: 实例 cout内部构造函数,以了解构造函数被调用的次数。

    推荐文章