C++ 如何预先计算,以C++;,模板类型,并在不同的模块中使用它
我有一个编译器优化问题C++ 如何预先计算,以C++;,模板类型,并在不同的模块中使用它,c++,templates,g++,C++,Templates,G++,我有一个编译器优化问题 typedef typename static_update_manager<A>::type manager_t; static_update_manager_lst< boost::mpl::vector<A, B, C> > typedef typename static_update_manager_lst< boost::mpl::vector&
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
让A、B、C三个类和静态更新管理器另一个尚未实现的类
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
静态更新管理器必须按如下方式使用:
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
typedef typename static\u update\u manager::type manager\u t;
manager_t的定义放在名为manager.hpp的头文件中,并且
许多模块都使用该标头
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
在编译过程中,计算静态\u更新\u管理器::类型取而代之的是
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
static\u update\u manager\u lst
计算管理器类型的时间非常长,占用大量内存。
问题是所有模块都在执行该演算。但事实上,我们只需要做一次
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
有C++机制吗?
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
一个想法是使用gcc将file manager.hpp转换为另一个文件manager_.hpp看起来像:
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
typedef typename static\u update\u manager\u lstmanager\u t;
并在所有模块中使用manager_compiled.hpp而不是manager.hpp
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
但我不知道如何正确地做到这一点
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;
我有一个可怕的解决办法:这个想法是制作一个脚本,编译一个包含错误的源代码 管理器的类型\u t,然后在
要构造头管理器,可以尝试预编译头。静态类型安全性很好,但有时代价太高。也许您可以将其中的一部分转移到运行时并降低复杂性。谢谢@NeilKirk,我已经尝试了您的想法。但是,不幸的是,预编译头
manager.hpp.gch
的大小为1.2go,并且我的模块的编译时间增加而不是减少。哇!!!!!!!!!那是一门非常复杂的课。创建预编译头需要更长的时间,但思想是后续编译会更快(只要头没有更改)
typedef typename static_update_manager<A>::type manager_t;
static_update_manager_lst< boost::mpl::vector<A, B, C> >
typedef typename static_update_manager_lst< boost::mpl::vector<A, B, C> > manager_t;