来自重载或模板化函数的额外未使用代码的影响?

Impact of extra unused code from overloaded or templated function?

本文关键字:未使用 代码 影响 函数 重载      更新时间:2023-10-16

我正在使用PCL库编写一个用于点云注册的接口类。这意味着我需要使用它的类,这些类大部分都是模板化的。但是,在运行时之前,我不会知道用户想要使用的数据类型。我可以接受存储几个可能为空的指针,指向我可能不需要使用的数据和对象,因为它们太少而无法对内存使用产生有意义的影响,并且我的类只有一个对象。

但是,我还必须以一种或另一种方式复制我的一些代码,因为它将使用 PCL 的基础模板化代码。例如,我可能需要以下内容

template<typename PointT>
process_cloud(pcl::PointCloud<PointT> &input_cloud);

我需要这个函数(以及其他几个(的 3-4 个实例化,以便能够在运行时之前处理未被选中的类型。但是,我最终只会使用其中之一。如果这些函数的大小不平凡,我可以预期对性能产生什么样的影响?

如果它是不可忽略的,我该如何消除它?我试图找出不需要重复代码的方法,但是如果不编写自己的模板化代码,我就找不到一种多态处理模板化代码的方法。

如果我必须使用这种设计,有没有办法优化内存布局以最大程度地减少缓存未命中对性能的影响?例如,我能否保证我的普遍需要的函数将紧密地结合在一起,而不会被可能永远不会调用的实例化所淡化?

我想过把整个班级都模板化。这将使代码更加本地化,因为每个 isntantiation 都会将串联调用的函数(相同的数据类型(组合在一起。它还将通过创建不需要模板化的代码副本来引入更多的代码膨胀。为了避免这种额外的膨胀,我能想到的最好的概念是:

template<typename PointT>
class Processor {
public:
process_cloud(pcl::PointCloud<PointT> &input_cloud);
...
}
class Interface {
public:
// ...
// bunch of common functions
// ...
// Instantiations I'm going to need. Pointers to save space.
// Could also be std::optional if pointers turn out to be unneeded
std::unique_ptr<Processor<pcl::PointXYZ>> p1;
...
}

这应该产生一个内存布局,其中公共功能被分组在一起,因为它们是在Interface中定义的。每个点类型还具有在其上使用的函数也组合在一起,因为它们是在单独的类中定义的。不过,它的可读性有点差。是否有更简洁的方法可以帮助编译器理解具有相同参数的模板实例化将串联使用并且应该是本地的?它可能会实现并自动完成吗?

您可以通过在单独的编译单元中放置显式实例化来试验它,而不是将它们全部放在同一个编译单元中。

我的猜测是差异不会很大,因为唯一的区别是ITLB未命中。

由于代码更本地化,因此在单独情况下更少。 您将获得更多的总代码,但如果您只使用一个实例,其余的不应该影响运行时,因为它永远不会污染缓存,并且可能会在某个时候被换掉。

如果编译器和链接器没有决定要对其损坏名称中的第 3 个字母之后的函数进行排序,或者出于某种稍微好一点的原因。