假设我有一个对象,每个程序运行大约需要30秒。每次运行程序时,都会使用相同的数据构造此对象。这个问题有什么解决方案?
编辑:
我根据我的问题的更具体版本进行了一些研究。特别是,我想用一些值填充哈希表。我找到http://www.gnu.org/software/gperf/来解决这个问题。 gperf生成一个完美的哈希函数和相关的表格。
答案 0 :(得分: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
那样静态初始化。
答案 1 :(得分:1)
您的问题没有通用解决方案。您需要分析对象以确定在30秒内创建的内容,并找到一些方法来表示特定数据,而无需进行大量计算。
一旦您了解了如何在不进行计算的情况下重现特定数据,您就可以轻松地将其序列化为您喜欢的任何存储(包括临时存储,以后再添加到编译对象中)。从那里,将它反序列化回你的对象不应该是一项艰巨的任务。
当然,这假定您的对象没有使用动态资源(打开文件,套接字,内存分配等)。你无法序列化。
答案 2 :(得分:1)
考虑如何以另一种方式表示对象。例如,如果它是您生成的多层图像,您可能只需加载完全合成的图像,而不是每次运行时都生成它。