代码之家  ›  专栏  ›  技术社区  ›  Benoît photo_tom

是否有针对模板使用的优化c++编译器?

  •  23
  • Benoît photo_tom  · 技术社区  · 17 年前

    现在我想知道是否有任何c++编译器可以尽量减少解释模板类所需的时间。我可能错了,但我觉得我所知道的编译器只在之前的版本中添加了模板解释。

    我的问题是:

    • 是否有项目开发新一代的c++编译器来优化这一点?
    8 回复  |  直到 17 年前
        1
  •  14
  •   Glorfindel Doug L.    7 年前

    我希望使用可变模板/右值引用可以加快编译模板化代码的速度。今天,若我们想编写在编译时执行某些操作的模板代码,我们就滥用了语言的规则。我们创建了数十个重载和模板专门化,以实现我们想要的结果,但不是以告诉编译器我们的意图的方式。因此,编译器在构建时几乎没有快捷方式。看 Motivation for variadic templates

    是否有项目开发新一代的c++编译器来优化这一点?

    CLang

    Fibonacci<100> ).

    CLang仍在其 early days 但我认为它有很好的机会成为一个伟大的C++编译器。

        2
  •  9
  •   Benoît photo_tom    16 年前

    我也不是C++语言律师,所以我可能会对一些细节感到困惑。

    C++编译器编译模板元程序花费如此长时间的主要原因是模板元程序的指定方式。

    它们不是直接指定为您希望编译器在编译时运行的代码。以计算类型列表的长度为例。

    compile_time size_t GetLength(TypeList * pTypeList)
    {
        return DoGetLength(pTypeList, 0);
    }
    
    compile_time size_t DoGetLength(TypeList * pTypeList, size_t currentLength)
    {
        if (pTypeList)
        {
            return DoGetLength(pTypeList->Next, ++currentLength);
        }
        else
        {
             return currentLength;
        }
    }
    

    这是与使用它的代码分开编译的方式,并通过一些语法暴露给语言,然后编译器将能够非常快速地执行它。

    这只是一个简单的递归函数调用。

    设计允许这些事情的语言是可能的。大多数这样做的(如lisp)都是动态类型的,但也可以使用静态类型。然而,它不太可能是你在C++中实现的东西。

    然而,C++的问题在于,代码的编写方式如下:

    template <typename First,  typename Second>
    struct TypeList
    {
        typedef First Head;
        typedef Second Tail;
    };
    
    template <>
    struct ListSize<NullType>
    {
        enum {  size = 0  };
    };
    
    template <typename Head, typename Tail>
    struct ListSize<TypeList<Head, Tail> >
    {
        enum {  size = 1 + ListSize<Tail>::size  };
    };
    

    为了让编译器“执行”元程序,它必须:

    1. 绑定每个构造的模板类型引用的所有符号
    2. 对依赖关系图进行拓扑排序
    3. 遍历图表并计算常数

    这比简单地运行O(N)递归算法要昂贵得多。

        3
  •  7
  •   Community Mohan Dere    9 年前

    主要问题

    您不能(通常)将模板类的定义与其声明分开,并将其放入.cpp文件中。

    结果: 每当你包含一个头文件时,你都会包含大量代码,在正常情况下,这些代码会很好地分离成.cpp文件并单独编译。每个编译单元都包含一些头文件,因此,使用模板时,每个编译单元包含 很多 通过所包含的标题,可以查看代码或几乎所有项目。

    如果这是你的问题,那么看看这里,一个相关的问题:

    它有一个 very good answer 解决那个问题 .

    MyType<int> MyType<double>

    g++ -fno-implicit-templates .

    这种技术非常有用,我认为应该将其纳入C++faq中: [35.12] Why can't I separate the definition of my templates class from it's declaration and put it inside a .cpp file?

        4
  •  4
  •   Community Mohan Dere    5 年前

    g++4.5在处理模板方面似乎取得了巨大的进步。以下是两个不可避免的变化。

    • “在打印类模板专门化的名称时,G++现在将省略来自默认模板参数的任何模板参数。”这可能被认为是一个微妙的修改,但它将对c++模板的开发产生巨大的影响(听说过不可读的错误消息……?没有了!)

    • “使用模板的代码的编译时间现在应该与实例化的数量成线性关系,而不是二次关系。”这将严重削弱反对使用C++模板的编译时间论点。

    请参阅 gnu site

        5
  •  2
  •   James Brooks    17 年前

    这不会是你想要的答案,但Walter Bright是第一个原生C++编译器的主要开发人员,也是一个优化的C++编译器。毕竟,他编写了自己的编程语言D。它基本上是对C++的改进,可以更好地处理模板。

    据我所知,没有任何c++编译器针对模板使用进行了优化。

        6
  •  2
  •   Paul Biggar    16 年前

    gold linker 可以帮助将链接时间减少约5倍,从而减少整体编译时间。它特别有用,因为链接不能像编译那样并行化。

    (这不是一个直接的答案,但希望这有帮助)。

        7
  •  1
  •   m-sharp    17 年前

    尝试 Incredibuild 。它大大缩短了编译/构建时间。

        8
  •  0
  •   Diego Sevilla    17 年前