C++ c++;计算用组织变量.速度和可读性

C++ c++;计算用组织变量.速度和可读性,c++,pointers,vector,containers,C++,Pointers,Vector,Containers,我目前正在做大量的数值计算,在使用变量(double类型)时,速度是最重要的。想知道是否有更具可读性的方法来执行以下操作,或者是否有更好的方法使用结构或boost库 更新:经过一段时间后,由于变量很多,我的最初目标是将变量间接组织到某种容器中,最好是将变量作为对象而不是引用/指针来维护。 1)我将对变量进行大而长的计算,它们按使用顺序声明,并在整个程序中更改 2)当我决定编辑代码时,可以随时将变量添加到程序中(非常频繁) 3)将变量组织(放入指针容器或其他任何容器中)对于简化这些对象的整体操作非

我目前正在做大量的数值计算,在使用变量(double类型)时,速度是最重要的。想知道是否有更具可读性的方法来执行以下操作,或者是否有更好的方法使用结构或boost库

更新:经过一段时间后,由于变量很多,我的最初目标是将变量间接组织到某种容器中,最好是将变量作为对象而不是引用/指针来维护。

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

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

3)将变量组织(放入指针容器或其他任何容器中)对于简化这些对象的整体操作非常重要-例如,在一段时间后将所有这些对象写入文件时,代码将更加精简和高效

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

我有很多变量做各种计算,比如这样(这需要时间):

我认为这是提高每个变量可读性的最明显的方法。为了存储集合以备将来可能输出,我将所有内容都放在一个容器中,并为每个元素创建一个引用变量,如下所示

std::vector<double> store;
...
ADD VALUES TO VECTOR
...
double& varName1 = store[0];
double& varName2 = store[1];
...
std::向量存储;
...
向向量添加值
...
double&varName1=存储[0];
double&varName2=存储[1];
...
但是,当我使用上述方法时,使用引用(&)变量进行计算的成本更高(超时)。然后我决定做相反的事情,存储一个指向变量的指针向量,如果我需要将所有文件写入文件,例如,我将使用这个向量,并对变量执行正常的计算(而不是引用)。为了做到这一点,我想出了以下(丑陋的)方法

std::向量存储;
双创建(双初始化、双d)
{
存储。推回(&d);
d=初始值;
}
double varName1=create_v(0.05,varName1);

我在1中徘徊)使用模板/ Boost更好地实现可读性,做同样的事情或2),像我这样的C++初学者应该知道什么样的方法吗?3) 优化我不考虑将上面提到的一些开销降到最低(我使用-O2和-O3进行测试,我使用g++4.7.2)

g++的4.7.2版本提供了C++11。这意味着您可以编写以下代码,将所有变量放入
向量中

vector vec={varName1,varName2,varName3,…,varNameN};
这是相当干净的,并且应该为您提供一种简单的方法,将您的变量组织成一个向量,以便输出。这是一本书


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

根据您的描述,使用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));

阅读它们的效果和你想象的完全一样:与写作相反。只需创建对象并将文件的内容混入其中。使用
数据集数组
应该同样直观。

您到底想做什么?严格的优化几乎总是需要特定的环境知识。我不会肯定任何一种方法比其他方法更快,但我会说避免使用指针和引用可能会有所帮助。此外,为了从缓存局部性中获益,请尝试按使用顺序声明内容。@Wug感谢您的评论。为了清晰起见,我更新了上面的内容,其中包含更多信息,新部件以粗体显示,感谢您的输入。为了满足我的需要,我在上述问题中提供了更清晰的黑体字。请注意,varName1等正在更改值(缺少要点,抱歉:(),并且对象在使用之前声明在不同的位置。我认为我需要这样做,因为我注意到速度上的差异。这些计算将很长(天)然而,对于数值分析来说,非常重要的是要注意,该方法将提供非常小的版本安全性。考虑添加一个方案来验证从文件读取的数据是否是您期望的版本。因为文件的内容将是结构的二进制数据、重新排序成员或添加/删除我。通俗地说,成员们会把一切搞砸。
vector<double> vec = {varName1, varName2, varName3, ..., varNameN};
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));