点云库 (PCL) - 声明点云时何时应使用 ::P tr 的经验法则?
Point Cloud Library (PCL) - rule of thumb for when ::Ptr should be used when declaring a point cloud?
当我进入点云库(PCL(时,我遇到了一些困惑,即何时在没有这个的情况下用::Ptr
节来声明点云。
它似乎以任何一种方式工作,例如,这两个程序都编译、运行和产生预期的结果(将随机的 20 点云写入文件(:
// WriteCloud.cpp
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
int main(void)
{
std::cout << "nn" << "starting program" << "nn";
pcl::PointCloud<pcl::PointXYZ> cloud; // !!! without ::Ptr !!!
int numPoints = 20;
for (int i = 0; i < numPoints; i++)
{
pcl::PointXYZ point;
point.x = 1024 * rand() / (RAND_MAX + 1.0f);
point.y = 1024 * rand() / (RAND_MAX + 1.0f);
point.z = 1024 * rand() / (RAND_MAX + 1.0f);
cloud.points.push_back(point);
}
// for simplicity, use an "unorganized" cloud, "width" = num points, "height" = 1
cloud.width = (int)cloud.points.size();
cloud.height = 1;
pcl::io::savePCDFileASCII("my_cloud.pcd", cloud);
std::cout << "nn" << "program complete" << "nn";
return (0);
}
和
// WriteCloudPtr.cpp
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
int main(void)
{
std::cout << "nn" << "starting program" << "nn";
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); // !!! with ::Ptr !!!
int numPoints = 20;
for (int i = 0; i < numPoints; i++)
{
pcl::PointXYZ point;
point.x = 1024 * rand() / (RAND_MAX + 1.0f);
point.y = 1024 * rand() / (RAND_MAX + 1.0f);
point.z = 1024 * rand() / (RAND_MAX + 1.0f);
cloud->points.push_back(point);
}
// for simplicity, use an "unorganized" cloud, "width" = num points, "height" = 1
cloud->width = (int)cloud->points.size();
cloud->height = 1;
pcl::io::savePCDFileASCII("my_cloud.pcd", *cloud);
std::cout << "nn" << "program complete" << "nn";
return (0);
}
对于应该使用哪个有经验法则吗? 更具体地说,以下是我的一些问题:
-在所有 PCL GitHub 示例中 https://github.com/PointCloudLibrary/pcl/tree/master/examples 程序都使用::Ptr
,而在网站上,大多数(但不是全部(示例都使用::Ptr
。 此外,在大多数情况下,我发现不使用::Ptr
的示例似乎很旧。 基于此,我的印象是::Ptr
通常被认为是当前的PCL标准,这是正确的吗?
-非::Ptr
方式似乎更简单,非::Ptr
方式有什么不明显的缺点吗? 在有人说"将这些传递给函数会制作云的副本,因此效率低下"之前,我会通过引用传递,以免不必要地制作副本。
-显然::Ptr
是boost::shared_ptr
的typedef(本质上是重命名(。 尽管如此,在不必要的情况下使用指针还是让我感到不舒服,因为在奇怪的情况下可能会发生有趣的事情。 例如,这篇文章的公认答案 从 pcl::P ointCloud 创建一个 pcl::P ointCloud::P tr 提到了一种奇怪的转换情况,这似乎可能导致崩溃。 在某些情况下,使用::Ptr
方式是否存在 PCL 用户应注意的风险?
恕我直言,将PointCloud
的函数参数定义为PointCloud::Ptr
是 PCL 中的一个设计缺陷,因为这些函数不关心对象是在堆栈上还是在堆上分配的,也不利用所有权。
对于您的问题,当您知道对象会变得非常大时,将对象声明为指针,否则坚持使用非指针版本。
- 何时返回指针与返回对象的一般经验法则?
- 具有完整五法则的简单链表
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 私有变量无法正常工作的C++getter方法(只有Java经验)
- 独特的指针和 3 法则
- 点云库 (PCL) - 声明点云时何时应使用 ::P tr 的经验法则?
- Qt5 QT_TRANSLATE_NOOP不适用于 tr()
- C++抽象类需要遵守五法则吗?
- C++ 接口必须遵循五法则
- 是按值抛出和按引用捕获的经验法则
- 并发::并行端口开销和性能命中率(经验法则)
- 新建和删除的经验法则
- 在C++中使用指针或引用作为函数的返回类型是否有经验法则
- 当通过值传递比通过常量引用传递快时的经验法则
- 标准库/模板化容器的常量语义的经验法则
- C++构造函数重载的经验法则
- 当“虚拟”是一个相当大的开销时,有什么经验法则吗
- 避免违反严格混叠规则的最简单的经验法则
- 将函数放在头文件中的经验法则
- 使用 auto&& 和 const auto & 的经验法则