我有一个需要大量数据来实例化的C ++对象。例如:
class object {
public object() {
double a[] = { array with 1 million double element };
/* rest of code here*/};
private:
/* code here*/
}
现在数据(即100万双数字)位于单独的文本文件中。问题:如何以高效的方式将它放在“double a []”之后并最终编译代码?我不想在运行时从文件中读取数据。我希望它与对象一起编译。什么可以解决方案?理想情况下,我希望数据位于单独的文本文件中,因为它目前存在,并且在某种程度上也有一个像上面的双a [] = .....这样的赋值。
这可能吗?提前谢谢!
答案 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_ptr
到std::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在第一次调用函数时被初始化,如果我没记错的话。)