c ++在编译时加载大量数据

时间:2012-11-30 01:56:57

标签: c++ visual-studio-2010

我有一个需要大量数据来实例化的C ++对象。例如:

  class object {
      public object() { 
          double a[] = { array with 1 million double element }; 
      /* rest of code here*/};
      private:
      /* code here*/    
  }

现在数据(即100万双数字)位于单独的文本文件中。问题:如何以高效的方式将它放在“double a []”之后并最终编译代码?我不想在运行时从文件中读取数据。我希望它与对象一起编译。什么可以解决方案?理想情况下,我希望数据位于单独的文本文件中,因为它目前存在,并且在某种程度上也有一个像上面的双a [] = .....这样的赋值。

这可能吗?提前谢谢!

3 个答案:

答案 0 :(得分:9)

类似的东西:

class object
{
  public
  object(){ double a[] = { 
     #include "file.h"
  }; 
   /* rest of code here*/};
  private:
  /* code here*/    
}

文件必须正确格式化 - 即包含如下内容:

//file.h
23, 24, 40,
5, 1.1, 

通常,您可以使用#include指令将内容粘贴到文件中。我已经看到virtual方法被粘贴了,如果它们对于大多数派生类来说都很常见。我个人并不喜欢这种技巧。

答案 1 :(得分:0)

Luchian Grigore的回答非常正确。但是编译器可以对源代码行的长度有一些限制。请参阅example https://stackoverflow.com/questions/10519738/source-line-length-limit

所以试试你的编译器。但我担心,更简单的问题解决方案是从文件中读取大量数据。

答案 2 :(得分:0)

这种设计的一个大问题是堆栈上的100万int可能会炸掉堆栈。您可能想要的是将数据放在数据段上,或者存储在二进制文件中的某种资源中,并且可以在运行时加载。如果您需要多个数据副本,请在运行时将其复制到std::vector,以便您知道数据位于免费存储(堆)上。 Mayhap甚至使用shared_ptrstd::array来减少不必要的意外重复的可能性(或unique_ptr以减少引用重复的机会)。

我所说的4mb数据不会发挥得那么好。对于其他变量,4mb阵列的引用位置不会是您最关心的问题。

根据您编译的目标平台和框架,将有一些方法将这种数据填充到二进制资源中。我从来没有为多兆字节文件做过,但这里是资源文件的visual studio帮助:http://msdn.microsoft.com/en-us/library/7zxb70x7%28v=vs.80%29.aspx

请注意,“代码中的数据”并不能使加载速度更快(除了遍历文件系统一次以找到它之外)。操作系统仍然需要加载二进制文件,较大的二进制文件需要更多的时间来加载,并且大量的值将占用二进制文件中与在不同文件中一样多的空间。真正的优点是它不是一个相对于你的可执行文件“错放”的文件,但是资源分叉/资源文件/ etc方法可以处理它。

如下面的评论中所述,static const数据(和全局数据)往往被加载到数据段中,这与堆(也称为免费存储)和堆栈(也称为自动存储)不同。我忘记了标准所称的内容。我知道函数中的static局部变量的行为与static或全局非局部变量的行为有关初始化顺序(全局(static或不))数据初始化完全在main开始之前,static local在第一次调用函数时被初始化,如果我没记错的话。)