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

时间:2017-08-03 11:52:08

标签: c++ performance templates overloading

我正在使用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中定义的。每个点类型也使用它上面的函数也组合在一起,因为它们是在单独的类中定义的。但它的可读性稍差一点。任何更清洁的方法来帮助编译器理解具有相同参数的模板实例将串联使用并且应该是本地的?它可能会自动实现并自动完成吗?

1 个答案:

答案 0 :(得分:0)

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

我的猜测是差距不大,因为唯一不同的是ITLB未命中。

由于代码更加本地化,​​单独案例的情况更少。 您将获得稍多的总代码,但如果您只使用一个实例,则其余部分不应影响运行时,因为它从不污染缓存并且可能在某个时间被换出。

如果编译器和链接器没有决定他们想要在其错位名称中的第3个字母之后对函数进行排序,或者出于某些更好的原因。