当我遍历集合,说Point
s的向量,其中Point
是一些结构保存x
,y
,z
数据什么的,当我需要这些点一个点转换成另一种类型的时间,我应该考虑它那样难副本?
举例来说,如果我有一个vector<Point> v
,我明明尽量避免:
vector<OtherPointType> vo;
// populate v
std::transform(v.begin(), v.end(), vo.begin(),
[](Point const& p) { return OtherPointType{p.x, p.y, p.z}; });
SomeOperation(vo); // Can only operate on vector<OtherPointType>
但是,是因为这样做昂贵:
for_each(..., [](Point const& p)
{
OtherPointType opt(p.x, p.y, p.z);
SomeOperation(opt); // Can only operator on `OtherPointType`
});
?
我的直觉说,因为以后是没有任何动态分配一个静态副本,它不应该是昂贵的,但我想这是重要的,足以问。
通常我可以使用类似Eigen::Map
在后一种情况下,但即使有,我还在写两个int
s(堆栈上),我认为由于Eigen::Stride
(这是甚至在这种情况下?一个很好的解决方案),但后来有像库CGAL没有映射功能,我很好奇一个好的方法来与他们合作。
请注意,我的工作通常以每秒一万点的交易,让我尝试尽可能多的,因为我可以减少昂贵的副本是非常重要的。
更新
到了那里我想知道Eigen::Map
是否会在上述后一种情况下良好的子问题:
我跑了benchmark,并用gcc 5.4至少,甚至用100万点,结果是分不出胜负。使用Eigen::Map
VS构建Eigen::Vector3d
了276 ms和285 ms的分别。用较少的点虽然构建了更短的时间,它告诉我的区别就在这里是被我的计算机上运行可能有一个更大的影响,不确定性和其他进程中。
我应该考虑[转换]那样难副本?
由于这是一个不同的操作,不一定。这可能是或多或少昂贵。但它是一个合理的估计它相当于一个副本。
但是,为[复制]的载体为[迭代向量和每个元素复制到一个自动变量如昂贵
可能不是。
我的直觉说,因为以后是没有任何分配的静态副本,它不应该是昂贵
这就是为什么,后者可能并不像以前那样昂贵。但无论后者是昂贵取决于上下文。它仍然是线性渐进复杂的操作,因此,如果向量大,分配可能是比较副本微不足道。
无论什么比你的硬件别的东西更加昂贵,而且东西是贵在你的程序的情况下,你可以尝试找出使用分析。