处理结构数组的正确方法:所有在一个地方vs拆分vs结构中的数组

Proper way of dealing with array of structs: all in one place vs splitting vs arrays within structs

本文关键字:vs 数组 结构 一个 拆分 方法 处理      更新时间:2023-10-16

我正在努力寻找处理结构集数组的最有效方法。也就是说,目前我有以下结构:

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个组合中都是固定的(但不是常量),唯一改变的是10个权重的集合w。这让我觉得复制1000次是浪费内存。。。我有可用的代码,但我想让它更快,我的理解是,这将是最明显的优化位置(因为该函数被调用了数百万次,90%的时间都在那里)。从结构中获取权重,并保留结构的1d数组,这样做更好吗?这意味着另一个数组参数被传递给一个函数,这不是会减慢它的速度吗?也许我应该使用里面有数组的structs?还有其他可能出现的问题吗?

我建议使用一个包含一个double的类,其中包含三个静态成员,用于不变的内容。

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

这样既节省了空间,又可以方便地访问其他三个变量,IMO最好保留类,而不是只使用一个doubles数组,因为它保留了变量之间的关联,还为以后修改类提供了机会。类实际上不会像你想象的那样造成太多开销,尤其是在现代编译器中。

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

,您可能还想使其常量

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

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

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)分配给100myStruct对象的一组,并将另一个属性分组分配给其他1000myStruct对象(使用静态成员无法实现这一点)。