我是否应该认为静态副本成本高昂

Should I consider a static copy to be costly?

本文关键字:副本 高昂 静态 是否      更新时间:2023-10-16

当我遍历一个集合时,比如Point的向量,其中Point是保存xyz数据或其他数据的某个结构,当我需要一次一点地将这些点转换为另一种类型时,我是否应该认为它与副本一样昂贵?

例如,如果我有一个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(在堆栈上),我认为这是由于Eigen::Stride(在这种情况下,这甚至是一个好的解决方案吗?)但也有像CGAL这样的库不具有映射功能,我很想找到一种好的方法来处理它们。

请注意,我的工作通常每秒处理一百万个点,所以尽可能减少昂贵的副本是很重要的。

更新

对于我想知道Eigen::Map在上述后一种情况下是否好的子问题:

我运行了一个基准测试,至少在gcc 5.4的情况下,即使有1亿分,结果也太接近了。使用Eigen::Mapvs构建Eigen::Vector3d分别耗时276ms和285ms。虽然构建所需的时间较少,但点数较少,这告诉我,这里的差异在于不确定性,而在我的计算机上运行的其他过程可能会产生更大的影响。

我是否应该将[转换]视为与副本一样昂贵?

因为这是一个不同的操作,不一定。它的成本可能或多或少。然而,将其与副本进行比较是合理的。

但是,[复制向量]是否与[迭代向量并将每个元素复制到自动变量]一样昂贵

可能不会。

我的直觉是,因为后者是一个没有任何分配的静态副本,所以它不应该是昂贵的

这就是为什么后者可能不如前者昂贵的原因。但后者是否昂贵取决于具体情况。它仍然是一个具有线性渐近复杂度的运算,因此,如果向量很大,则与副本相比,分配可能无关紧要。

硬件上的某些东西是否比其他东西更贵,以及在程序的上下文中是否有一些东西很贵,您可以尝试使用探查器来查找。