我是否应该认为静态副本成本高昂
Should I consider a static copy to be costly?
当我遍历一个集合时,比如Point
的向量,其中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
(在堆栈上),我认为这是由于Eigen::Stride
(在这种情况下,这甚至是一个好的解决方案吗?)但也有像CGAL这样的库不具有映射功能,我很想找到一种好的方法来处理它们。
请注意,我的工作通常每秒处理一百万个点,所以尽可能减少昂贵的副本是很重要的。
更新
对于我想知道Eigen::Map
在上述后一种情况下是否好的子问题:
我运行了一个基准测试,至少在gcc 5.4的情况下,即使有1亿分,结果也太接近了。使用Eigen::Map
vs构建Eigen::Vector3d
分别耗时276ms和285ms。虽然构建所需的时间较少,但点数较少,这告诉我,这里的差异在于不确定性,而在我的计算机上运行的其他过程可能会产生更大的影响。
我是否应该将[转换]视为与副本一样昂贵?
因为这是一个不同的操作,不一定。它的成本可能或多或少。然而,将其与副本进行比较是合理的。
但是,[复制向量]是否与[迭代向量并将每个元素复制到自动变量]一样昂贵
可能不会。
我的直觉是,因为后者是一个没有任何分配的静态副本,所以它不应该是昂贵的
这就是为什么后者可能不如前者昂贵的原因。但后者是否昂贵取决于具体情况。它仍然是一个具有线性渐近复杂度的运算,因此,如果向量很大,则与副本相比,分配可能无关紧要。
硬件上的某些东西是否比其他东西更贵,以及在程序的上下文中是否有一些东西很贵,您可以尝试使用探查器来查找。
- 用callgrind追踪不必要的副本
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查注册表项是否链接到(或副本)另一个注册表项
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- C++基于范围的 for 循环和元素副本
- 创建提升::shared_ptr的深层副本
- 如何从构造函数副本 T(const T&)调用对象 T?
- 副本初始化的默认模板参数推导
- C++深浅的副本
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- Eigen - matrix.transpose 会创建矩阵的副本吗?
- 将 MatrixXd 的行传递给要修改的函数,而不在 Eigen 中创建副本
- 对如何制作双链表的深度副本感到困惑?
- 为什么 std::string s = "123" 当不涉及副本时被视为复制初始化?
- 指向基类的指针的 std::vector 的深层副本
- 如何避免将数据缓冲区的额外副本复制到字符串?
- 无法识别的类函数副本
- 使用unique_ptr并返回引用,或者我应该使用shared_ptr并在需要时制作副本
- 我是否应该认为静态副本成本高昂