有什麼辦法可以在最終的二進制文件中合併模板類的相同成員函數嗎?我有可能支持特定的功能,並依賴於一個類,可能需要一些額外的步驟裏面的成員函數:根據實際g ++:合併模板成員函數實例
像Driver<Feature::A>::set
或
Driver<Feature::A | Feature::B>::set
template <uint32_t features>
class Driver {
static bool set (uint32_t value) {
/* do something required for every feature */
if (features & Feature::A)
/* do special things if Feature::A */
/* do something required for every feature */
if (features & Feature::B || features & Feature::C)
/* do something special for either Feature::B or Feature::C */
return true;
}
/* more, similar methods */
};
在代碼後,我會再使用電話可用功能。到目前爲止,所有這些工作都很順利,只有使用g++-5.4.0 -std=c++11 -O3
編譯的已發佈代碼纔會合併完全相同的方法,所以我希望使用它。在這個類中具有多個功能,其中主要的共同部分,真正打破了最終的二進制文件的大小。在使用私有函數用於公用部分減小了尺寸的開銷,但不是友好的在我看來閱讀:
template <uint32_t features>
class Driver {
static void _set_common_0 (value) {
/* do something required for every feature */
}
static bool set (uin32_t value) {
_set_common_0 (value);
if (features & Feature::A)
_set_special_0 (value);
_set_common_1 (value);
if (features & Feature::B || features & Feature::C)
_set_special_1 (value);
return true;
}
};
而且這引入了問題,如果是在特殊的一個一個「早出」路徑部分,以前可以通過一個簡單的return
現在可以完成從子功能升級,根據這些子功能的返回值進行進一步檢查...
我想要的是編譯器爲Driver<Feature::B>::set
和Driver<Feature::C>::set
發出(使用時)符號,但讓它們通過代碼指向相同的代碼位置,因爲它們是相同的。任何想法我怎麼能做到這一點? (優選地,用C++ 11保持,且不需要從一個較新的標準功能)
編輯:爲了澄清,我想知道,爲什麼相同的指令序列(由模板實例此處產生)不被gcc
組合。據我的理解,-ftree-tail-merge
應該至少替換那些跳轉到相同的實現/代碼序列(例如Driver<Feature::B>::set
和Driver<Feature::C>::set
)。
您真的需要一個類模板嗎?因爲這不是應該如何使用模板:你正在運行時檢查編譯時間常量:'if(features&Feature :: A)' –
它不是一個真正的編譯時間常量。應該使用的功能是運行時依賴和編譯過程中不知道的。在運行時環境的Dependend上,我可以使用'Feature :: A'或不能使用它。 '驅動程序 :: set'調用不是直接發出,而是通過在初始化期間分配的函數指針,依賴於檢測到的環境特徵。 –
Jonas