当我进入点云库(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 中的一个设计缺陷,因为这些函数不关心对象是在堆栈上还是在堆上分配的,也不利用所有权。
对于您的问题,当您知道对象会变得非常大时,将对象声明为指针,否则坚持使用非指针版本。