2013-03-17 37 views
2

我目前正在进行大型数值计算,并且在使用变量(类型为double)时速度是最重要的。想知道是否有更可读的方式来执行以下操作,或者如果使用结构或增强库有更好的方法。C++组织计算的变量 - 速度和可读性

UPDATE:经过一段时间后,由于许多变量,我的最初目标是将变量间接组织到某种容器中,最好将变量保持为对象而不是引用/指针。

1)我将在变量做的大和冗长的计算,他们在声明的顺序使用它们和整个程序

2)变量可以被添加到该程序改变在我决定编辑整理变量的代码(相当频繁)

3)任何时间(为指针的容器或其他)是为了便于与这些对象共同工作的重要 - 这将是更加精简当我例如高效的代码写一段时间

我当时就想,反而让创造一个类型的类后,文件中的所有这些对象(所有的变量对象是双精度型),并自动添加到指针的载体 - 作为一个方面的问题,这会不会矫枉过正

我有很多的变量做各种计算的,像这样(这正好需要时间):

double varName1 = someValue; 
double varName2 = someValue; 
double varName3 = someValue; 
... 
double varNameN = someValue; 
... 
SOME_COMPUTATION HERE 

这是我相信每个变量的可读性最明显的方式。为存储集合在未来可能的输出,我把一切都放入容器,并制成的参考变量的每个元素像这样

std::vector<double> store; 
... 
ADD VALUES TO VECTOR 
... 
double& varName1 = store[0]; 
double& varName2 = store[1]; 
... 

当我然而上述方法中,计算参考(&)变量是更昂贵的(加班)。然后,我决定做相反的事情,将指针向量存储到变量中,如果我需要将所有文件写入文件,例如我将使用此向量并对变量执行正常计算(不是引用)。要做到这一点,我想出了以下(丑陋的)方式

std::vector<double*> store; 
double create_v(double init, double& d) 
{ 
    store.push_back(&d); 
    d = init; 
} 

double varName1 = create_v(0.05,varName1); 

我是游荡,如果1)存在的可读性更好地实施这一使用模板/升压,做同样的事情或2)有另一种像我这样的C++初学者应该知道吗? 3)优化我没有考虑到最小化上面提到的一些开销(我用-O2和-O3进行测试,并且使用g ++ 4.7.2)

+1

你究竟想要做什么?紧密优化几乎总是需要具体情况的知识。我不会肯定地说任何一种方法比其他方法都快,但我会说避免使用指针和引用可能会有所帮助。此外,为了从缓存本地获益,请尝试按照它们的使用顺序进行声明。 – Wug 2013-03-17 06:49:57

+0

@Wug感谢您的评论。为了清晰起见,我更新了上面的内容,其中有更多的信息,新的部分以粗体显示 – woosah 2013-03-17 15:32:25

回答

1

g ++的4.7.2版本提供了C++的support 11的initializer lists。这意味着,你可以写下面的代码把所有的变量在vector<double>

vector<double> vec = {varName1, varName2, varName3, ..., varNameN}; 

这是合理的清洁,并应提供您安排您的变量转化为输出的目的载体的简单方法。这是一个small demo on ideone

P.S.你的第三个例子不起作用,因为你推回了一个引用,而不是一个指针。虽然这应该是编译时错误。

+0

感谢您的意见。为了满足我的需求,我在上面的问题中提供了更加清晰的内容。请注意,varName1等正在改变的价值观(重要的点错过,对不起:()和对象是在不同的位置声明之前,他们被使用。我想我需要他们,因为我注意到速度的差别,否则这些计算将是漫长的(天),纯粹用于数值分析 – woosah 2013-03-17 18:10:39

0

根据您的描述,使用c-style结构可能是可以接受的。您可以利用某些符合特定限制(普通旧数据限制或POD)的结构行为来进一步简化其行为。

POD结构体不能有默认的构造函数,析构函数或复制构造函数(编译器提供的默认值除外),并且不能有任何虚拟方法或指针或引用类型的任何成员。你应该能够完成这个没有太大困难。

一旦你做到了这一点,你就可以宣布这样的结构是这样的:

struct DataSet 
{ 
    double foo; 
    double bar[48]; // arrays are legal in POD types 
    // snip however many more declarations 
}; 

你可以将这些结构保存到一个文件的东西,如:

DataSet ds; 
// populate and process dataset 
ofstream outputfile("somefile.dat", ios_base::out); 
outputfile.write((char *) &ds, sizeof(DataSet)); 

阅读它们将完全按照您的预期工作:与书写相反。只需创建该对象并将该文件的内容放入其中即可。使用数组DataSet应该同样直观。

+0

然而,需要注意的是,此方法提供的版本安全性非常低,请考虑添加方案以验证您从文件中读取的数据是否符合您期望的版本。的文件将实际上是结构的二进制数据,重新排序成员或添加/删除成员将通俗地说,搞砸了一切。 – Wug 2013-03-18 02:41:12