处理结构数组的正确方法:所有在一个地方与分裂对比结构中的数组

时间:2013-08-05 00:15:56

标签: c++ arrays performance struct coding-style

我正在尝试找到处理数组结构的最有效方法。也就是说,目前我有以下结构:

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;
};

现在,问题是p1p2p3的十个值的集合在所有1000个组合中都是固定的(但不是const),唯一改变的是一组10个重量w。这种情况让我认为浪费了1000次内存复制...我已经有了工作代码,但我想更快地完成它,我的理解是这将是最明显的优化场所(如这个功能被称为数百万次,90%的时间都在那里。是否更好地从结构中获取权重并且具有留下1d结构数组的2d双数组?这意味着另一个数组参数传递给一个函数,不会减慢它的速度吗?也许我应该在其中使用数组结构?可能出现的任何其他问题吗?

3 个答案:

答案 0 :(得分:1)

我建议让一个包含带有三个静态成员的double的类用于不改变的事物。

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

这样你可以节省空间并且仍然可以轻松访问其他三个变量,IMO最好保留类而不是仅使用双精度数组,因为它保留了变量之间的关联,并且还提供了一个稍后修改课程的机会。对于现代编译器而言,类并不会导致过多的开销。

如果静态变量永远不会改变

,您可能还想让它们成为常量变量

答案 1 :(得分:0)

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

答案 2 :(得分: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个对象(使用静态成员无法实现此目的)。