处理结构数组的正确方法:所有在一个地方vs拆分vs结构中的数组
Proper way of dealing with array of structs: all in one place vs splitting vs arrays within structs
我正在努力寻找处理结构集数组的最有效方法。也就是说,目前我有以下结构:
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;
};
现在,问题是p1
、p2
、p3
的十个值的集合在所有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
对象(使用静态成员无法实现这一点)。
- 使用 std::array vs 数组传递对象数组
- std::数组运算符[] vs get<>
- vs 2012 Ultimate Update 4不会编译数组
- VS 在打印字符串数组元素 - c++ 时中止
- 指针指针:std:vector vs. 数组
- C/C++ int[] vs int*(指针与数组表示法).有什么区别
- 在VS中的Watch中按索引查看数组元素
- 将数组传递到函数中 - 指针与引用(C++ vs c)
- VS 2010:处理 3D 数组时出现错误 cxx0030
- 静态数组 VS.C++11 中的动态数组
- 如何在VS调试器中查看c++中动态字符串数组的内容
- 处理结构数组的正确方法:所有在一个地方vs拆分vs结构中的数组
- 向前vs向后数组行走
- Char数组vs Int数组
- 使用 VS 2012 在构造函数中的树节点中初始化数组
- 作为指针的字符串vs数组
- 删除main函数vs中分配的数组
- Make_unique数组,原始提案vs.最终提案
- 矢量vs数组性能
- 解引用vs数组访问