5

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

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

现在数据(即 100 万个双精度数)位于单独的文本文件中。问题:如何以有效的方式将它放在“double a[]”之后并最终编译代码?我不想在运行时从文件中读取数据。我希望它与对象一起编译。有什么办法可以解决?理想情况下,我希望数据位于当前所在的单独文本文件中,并且不知何故还有一个像上面的 double a[] =..... 这样的分配。

这可能吗?提前致谢!

4

3 回答 3

10

就像是:

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这样粘贴的方法,如果它们对于大多数派生类来说很常见的话。我个人不是很喜欢这种技术。

于 2012-11-30T01:58:16.320 回答
0

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

我要说的就是 4mb 的数据并不能很好地发挥作用。4mb 数组对其他变量的引用位置不会成为您最关心的问题。

根据您编译的目标平台和框架,将有办法将此类数据填充到二进制资源中。我从来没有为多兆文件做过,但这里是视觉工作室对资源文件的帮助:http: //msdn.microsoft.com/en-us/library/7zxb70x7%28v=vs.80%29。 aspx

请注意,“代码中的数据”并不能从根本上提高加载速度(除了遍历文件系统一次以找到它之外)。操作系统仍然需要加载二进制文件,更大的二进制文件需要更多的时间来加载,并且大量的值在二进制文件中占用的空间与在不同文件中占用的空间一样多。真正的优势在于它不是相对于可执行文件可能“放错位置”的文件,但资源派生/资源文件/等方法可以处理这个问题。

正如下面评论中所指出的,static const数据(和全局数据)倾向于加载到数据段中,这与堆(又名自由存储)和堆栈(又名自动存储)不同。我忘记了标准叫它什么。我确实知道函数中的局部变量在初始化顺序方面与全局非局部变量的static行为不同(全局(或非)数据在启动之前完全初始化,而本地在函数第一次初始化时被初始化调用,如果我没记错的话)。staticstaticmainstatic

于 2012-11-30T04:01:40.493 回答
0

The answer of Luchian Grigore is quite correct. But compiler can have some limit on length of source code line. See for example https://stackoverflow.com/questions/10519738/source-line-length-limit

So try on your compiler. But I am afraid, more simple solution of your problem will be reading of huge data from file.

于 2012-11-30T03:36:30.497 回答