来自重载或模板化函数的额外未使用代码的影响?
Impact of extra unused code from overloaded or templated function?
我正在使用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 个字母之后的函数进行排序,或者出于某种稍微好一点的原因。
- C++代码中奇怪的未使用的静态字符串声明
- 来自重载或模板化函数的额外未使用代码的影响?
- 在编译期间包含未使用的代码
- 用于 JUnit 测试的本机代码未使用 'nar-maven-plugin' 编译
- 如果 LTO 中的代码依赖于其构造的副作用,是否允许 LTO 删除未使用的全局对象?
- 我如何才能找到C 代码以找到所有未使用的返回值
- gcc 什么时候编译未使用的模板代码?
- C++Visual Studio Release生成未使用的代码崩溃
- 将未使用的元素添加到C/C 结构加快并减慢代码执行
- 进度条未使用C++代码和GTK+进行更新
- 编译器是否会排除未使用的模板代码
- qt-creator 中有没有办法检查未使用/死的代码
- 调试代码并C++未使用的参数警告
- 未使用调试器标志编译的代码出现分段错误
- CPP 使用代码块对 'Myclass::Myclass()' 的未定义引用
- 是否有任何工具/方法来检测/删除所有未使用的变量,宏,头(包括)和函数从c++代码
- 使用代码分析在Visual Studio 2010中查找未初始化的成员
- 未使用代码中的开销
- 如何使用Clang代码生成未使用的声明?
- 是为未使用的模板类方法生成的对象代码