0

假设我有一个在每个程序运行时构建大约需要 30 秒的对象。每次运行程序时,都会使用相同的数据构建此对象。这个问题有哪些解决方案?

编辑:

我针对我的问题的更具体版本进行了一些研究。特别是,我想用一些值填充哈希表。我发现http://www.gnu.org/software/gperf/解决了这个确切的问题。gperf 生成一个完美的散列函数和相关联的表。

4

3 回答 3

2

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静态初始化这样的东西。

于 2012-09-21T14:46:19.277 回答
1

您的问题没有通用的解决方案。您将需要分析您的对象以确定在这 30 秒内创建了什么,并找到某种方式来表示特定数据,而无需进行大量计算。

一旦您了解了如何在不计算的情况下重现特定数据,您就可以轻松地将其序列化到您喜欢的任何存储空间(包括临时存储空间,以便稍后添加到您的编译对象中)。从那里开始,将其反序列化回您的对象应该不是一项艰巨的任务。

当然,这假设您的对象没有使用动态资源(打开的文件、套接字、内存分配等)。你不能序列化它。

于 2012-09-21T14:45:58.757 回答
1

考虑如何以另一种方式表示对象。例如,如果它是您生成的多层图像,您可能只是加载一个完全合成的图像,而不是每次运行时都生成它。

于 2012-09-21T14:46:41.460 回答