假设我有一个在每个程序运行时构建大约需要 30 秒的对象。每次运行程序时,都会使用相同的数据构建此对象。这个问题有哪些解决方案?
编辑:
我针对我的问题的更具体版本进行了一些研究。特别是,我想用一些值填充哈希表。我发现http://www.gnu.org/software/gperf/解决了这个确切的问题。gperf 生成一个完美的散列函数和相关联的表。
假设我有一个在每个程序运行时构建大约需要 30 秒的对象。每次运行程序时,都会使用相同的数据构建此对象。这个问题有哪些解决方案?
编辑:
我针对我的问题的更具体版本进行了一些研究。特别是,我想用一些值填充哈希表。我发现http://www.gnu.org/software/gperf/解决了这个确切的问题。gperf 生成一个完美的散列函数和相关联的表。
C++11 引入了“常量表达式”的扩展概念,您可以通过constexpr
关键字将其赋予对象:
constexpr int a = 12; // constant expression
constexpr int f(int n) { return a * n; }
constexpr int b = f(a); // also constant expression
对象也可以声明构造函数constexpr
。函数限定为常量表达式的规则非常严格,但是如果您能够构建这样的对象,那么作为常量表达式的全局对象确实可以在编译时计算和存储。它们算作“静态初始化”(基本上是在程序启动之前初始化)。
在 C++11 之前,只有最简单的原始类型才有资格进行这种处理。
任何需要动态分配的东西都不能是一个常量表达式,所以没有希望像全局std::map
静态初始化这样的东西。
您的问题没有通用的解决方案。您将需要分析您的对象以确定在这 30 秒内创建了什么,并找到某种方式来表示特定数据,而无需进行大量计算。
一旦您了解了如何在不计算的情况下重现特定数据,您就可以轻松地将其序列化到您喜欢的任何存储空间(包括临时存储空间,以便稍后添加到您的编译对象中)。从那里开始,将其反序列化回您的对象应该不是一项艰巨的任务。
当然,这假设您的对象没有使用动态资源(打开的文件、套接字、内存分配等)。你不能序列化它。
考虑如何以另一种方式表示对象。例如,如果它是您生成的多层图像,您可能只是加载一个完全合成的图像,而不是每次运行时都生成它。