所以我有一个计算量很大的c ++函数,它从文件中提取数字并将它们放入向量中。当我在main中运行此函数时,需要花费很多时间。有可能以某种方式将此函数计算一次,然后链接到主程序,这样每次我尝试运行它时,我都可以在主程序中节省宝贵的计算时间吗?
我的功能是:
vector <double> extract (vector <double> foo)
{
ifstream wlm;
wlm.open("wlm.dat");
if(wlm.is_open())
{
while (!wlm.eof())
{
//blah blah extraction stuff
}
return foo;
}
else
cout<<"File didn't open"<<endl;
wlm.close();
}
我的主程序还有其他我在那里计算的东西。我不想从主程序中调用此函数,因为这需要很长时间。相反,我希望在编译期间预先提取向量,以便稍后在我的主程序中使用提取的向量。这可能吗?
答案 0 :(得分:2)
将您的功能更改为:
std::vector<double>& extract(std::vector<double>& foo)
所以你不会复制矢量两次(我想大部分时间都会吃)。
reserve()
内存中的矢量(如果可能的话,可以避免重新分配)。std::vector<double>
,而不仅仅是在结果良好的情况下。类似的东西:
std::vector<double>& extract (std::vector<double>& foo)
{
ifstream wlm;
wlm.open("wlm.dat");
if(wlm.is_open())
{
while (!wlm.eof())
{
//blah blah extraction stuff
}
wlm.close();
}
else
cout<<"File didn't open"<<endl;
return foo;
}
答案 1 :(得分:1)
虽然你的问题并不完全清楚,但我认为你想:
这当然是可能的,但您必须利用您正在使用的任何构建系统。没有更多细节,我只能给出一般答案:
创建一个可在编译期间调用的帮助程序。该程序应实现extract
函数并将结果转储到文件中。这里有两个主要选择:获取可嵌入到可执行文件中的资源文件,或生成包含数据的源代码。如果数据不是很大,我建议使用后者。
在程序中使用生成的文件
例如:
预建步骤 extract_data.exe extracted_data_generated
这会将提取的数据转储到标头和源中,例如:
// extracted_data_generated.h
#pragma once
extern const std::array<double, 4> extracted;
// extracted_data_generated.cpp
#include "extracted_data_generated.h"
const std::array<double, 4> extracted{ { 1.2, 3.4, 5.6, 6.7 } }; //etc.
在程序的其他部分中,使用生成的数据
#include "extracted_data_generated.h"
// you have extracted available as a variable here.
我也改成了std::array
,你的帮助程序会知道你的大小,因为你会知道矢量的大小。
资源路由类似,但您必须实现特定于平台的资源提取和读取数据。因此,除非您的计算数据非常大,否则我建议代码生成。