c ++组织变量进行计算 - 速度和可读性

时间:2013-03-17 06:35:03

标签: c++ pointers vector containers

我正在进行大型数值计算,当使用变量(double类型)时,速度至关重要。想知道是否有更易读的方法来执行以下操作,或者是否有更好的方法来使用结构或增强库。

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

1)我将对变量进行大而冗长的计算,它们按照它们的使用顺序进行声明并在整个程序中进行更改

2)当我决定编辑代码时,可以随时将变量添加到程序中(非常频繁)

3)组织变量(进入指针或其他任何容器)对于轻松地共同处理这些对象非常重要 - 当我例如,它将更加简化和高效的代码。一段时间后写入所有这些对象

我想改为创建一个创建类型的类(所有变量对象都是double类型)并自动添加到指针向量 - 作为一个附带问题,这会是一个过度杀伤

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

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];
...

然而,当我使用上述方法时,使用参考(&amp;)变量的计算成本更高(超时)。然后我决定做相反的事情,存储一个指针向量而不是变量,如果我需要将所有文件写入文件,例如我将使用此向量并对变量执行正常计算(不是引用)。为此,我想出了以下(丑陋)方式

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)

2 个答案:

答案 0 :(得分:1)

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

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

这是相当干净的,并且应该为您提供一种将变量组织到矢量中以便输出的简单方法。这是small demo on ideone

P.S。您的第三个示例不起作用,因为您正在推回引用而不是指针。不过,这应该是一个编译时错误。

答案 1 :(得分:0)

根据您的描述,使用c风格的结构可能是可以接受的。您可以利用某些符合某些限制(简单旧数据限制或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数组应该同样直观。