【发布时间】:2015-08-23 10:32:18
【问题描述】:
我正在编写一些代码来集成 ODE。这个问题既是对编码建议的请求,也是对解决方案的请求,所以如果您对我即将提供的建议有其他建议,请告诉我!
要由 ODE 积分器积分的“对象”以 6 个“块”的形式出现...原因是我有一个双精度的 std::vector,它们按以下方式排列:
前 3 个双精度值是位置坐标; x、y 和 z。 接下来的 3 个双精度是速度坐标; x、y 和 z。
所以,现在你知道了,我有一个函数,它接受成对的“位置”“”“向量”“” 作为参数并返回某种结果......看看我在哪里我要这样做吗?
目前该函数需要 2 批位置坐标,方式如下:
std::vector<double> magic_gravity_formula(const std::vector<double> &r1,
const std::vector<double> &r2, const double m1, const double m2)
我不想将 3 个一组的所有数据复制到新向量中 - 这是一种疯狂(而且非常慢)的编程方式。
我可以改用指向原始数据的指针...并且只需将指针传递给 x 坐标(3 个双精度块中的第一项) - 这对我来说似乎还可以,但是也许有更好的方法?有点像 Python 或 Matlab 数组切片?我可以这样做吗?
我有点想传递一个新的向量(或某种包装类?),从已经存储在数组中的数据创建...有点像
std::vector<double> sub_section_of_data = data[0..2] // Obviously pseudocode!
好的,所以上面的内容是荒谬的,因为可能实现该语法的语言仍然会进行复制操作,这可能会很慢 - 这正是我试图避免的......
所以是的,我不确定在这里进行的最佳方法是什么 - 任何人都可以提出一个“好的”解决方案吗? (以非主观方式!)
编辑:为了明确这一点 - 问题是我不想做这样的事情:
std::vector<double> r1_temp;
r1_temp.push_back(data[0]); // Copy ! Bad !
r1_temp.push_back(data[1]);
r1_temp.push_back(data[2]);
... same for an r2 ...
std::vector<double> force = magic_gravity_formula(r1, r2, m1, m2);
编辑 2:考虑编译器选项 - 编译器是否会通过以下方式更改函数以接受参数来为我优化我的代码:
std::vector<double> super_gravity_formula(double x1, double y1, double z1, double x2, double y2, double z2, double m1, double m2)
在这种情况下,也许这个问题并不重要? (除了形成“让你的代码看起来很好读”的观点。)
编辑 3:因此它仍然很重要。
【问题讨论】:
-
您是否考虑过使用移动语义?
-
我没有,你说的这些是什么?
-
我可以使用指向原始数据的指针。 - 这听起来像是一个计划。
-
本质上该函数需要使用“包含所有数据的大向量”中的数据 - 但是这些东西必须以三个对象的块的形式传递,例如传递整个数组作为参考 - 这行不通!
-
我认为你应该先分析一下,然后再决定什么更快。如果您的向量在大小上只有 6 个元素,则复制可能比通过以下指针可能使
CPU缓存的部分无效更快。
标签: c++ c++11 vector slice array-view