1

我试图找到处理结构集数组的最有效方法。即,目前我有以下结构:

struct myStruct{
    double p1;
    double p2;
    bool p3;
    double w;
}

因此,我建模的对象具有三个属性和分配给它们的权重。现在,它们排列在固定大小的数组中,比如 10,并且对象权重有多种组合,比如 1000:

const int nObj = 10;
const int n = 1000;

myStruct comb[n][nObj];

最后有几个函数我将 10 大小的数组传递给:

double evalComb(myStruct (&ms)[nObj], double q1, double q2){
    double output = 0;
    for(int i = 0; i < nObj; i++){
        output += // calculate some stuff using p1,p2,p3,w and other params
    }
    return output;
};

现在,问题是,的 10 个值的集合在所有 1000 个组合p1中是固定的(但不是 const ),唯一改变的是 10 个 weights 的集合。这种让我觉得复制所有 1000 次是浪费内存......我有工作代码,但想让它更快,我的理解是这将是最明显的优化地方(如该函数被调用了数百万次,并且 90% 的时间都在那里)。从结构中获取权重并让二维双数组留下一维结构数组会更好吗?这意味着将另一个数组参数传递给函数,它不会减慢速度吗?也许我应该在其中包含带有数组的结构?任何其他可能出现的问题?p2p3w

4

3 回答 3

1

我的建议是有一个类,其中包含一个包含三个静态成员的双精度成员,用于不变的事物。

struct myStruct{
    static std::array<double,10> p1;
    static std::array<double,10> p2;
    static std::array<bool,10> p3;
    double w;
}  

这样您可以节省空间并且仍然可以轻松访问其他三个变量,IMO 最好保留该类而不是仅使用双精度数组,因为它保留了变量之间的关联并且还为您提供了修改的机会稍后上课。类并没有你想象的那么大的开销,尤其是在现代编译器中。

如果静态变量永远不会改变,您可能还想将它们设为 const

于 2013-08-05T00:36:59.773 回答
0

如果 p1、p2 和 p3 的 10 个值从未改变,则使它们保持不变或使用#define。当编译器在您的方法或函数定义中使用文字将它们换出时,您将获得性能提升。在这种情况下,“对象”只是 w 的 10 个双精度数组。您还可以考虑将 w 声明为 1000 X 10 数组,以将分配的内存保持在连续块中。与结构中未对齐内存地址的混合变量类型相比,这将提高性能。

于 2013-08-05T01:17:56.217 回答
0

如果p1, p2, p3所有 100 个左右结构的成员都相同(共同),我想建议对您的设计进行更改。您为您的属性创建一个新的类/结构

struct myProperties {
    // TODO: define c'tor
    double p1;
    double p2;
    bool p3;
};

struct myStruct {
      myStruct(myProperties *properties_): properties(properties_) {}
      myProperties properties;
      // TODO: define getters for p1, p2, p3
};

创建myStruct具有相同属性的组时,您将指针传递给myProperties具有所需属性的对象

myProperties m(p1, p2, p3); 
myStruct s(&m);

这样,您可以将一个属性组(p1, p2, p3)分配给100 个 myStruct对象中的一组,并将另一个属性组分配给其他1000 个 myStruct对象(使用静态成员无法实现此目的)。

于 2013-08-05T03:12:28.363 回答