簡體   English   中英

重載或模板化函數會產生多余的未使用代碼嗎?

[英]Impact of extra unused code from overloaded or templated function?

我正在使用PCL庫編寫用於點雲注冊的接口類。 這意味着我需要使用大部分是模板化的類。 但是,在運行時之前,我將不知道用戶要使用的數據類型。 我可以存儲一些可能不需要為數據和對象使用的空指針,因為它們的數量太少,不足以對內存使用產生有意義的影響,並且我的類中只有一個對象。

但是,我還必須以一種或另一種方式復制我的某些代碼,因為它將使用PCL的基礎模板代碼。 例如,我可能需要以下內容

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

我將需要此函數的3-4個實例化(以及其他幾個實例)才能處理直到運行時未知的類型。 但是,我最終只會使用其中之一。 如果這些功能的規模不小,那么我對性能會有什么影響?

如果不可忽略,我該如何緩解? 我試圖找出不需要重復代碼的方法,但是我找不到不自己編寫模板代碼就可以多態處理模板代碼的方法。

如果我必須進行這種設計,是否有任何方法可以優化內存布局,從而最大程度地降低緩存未命中對性能的影響? 例如,我可以保證我普遍需要的功能會緊密結合在一起,並且不會被可能永遠不會調用的實例所淹沒嗎?

我考慮過為整個班級做模板。 這將使代碼更加本地化,​​因為每個實例化將將串聯調用的功能組合在一起(相同的數據類型)。 通過創建不需要模板化的代碼副本,它還將引入更多的代碼膨脹。 為了避免這種額外的膨脹,從概念上講,我能想到的最好的方法是:

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個字母后的函數進行排序,還是出於某種更好的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM