有什么办法可以在最终的二进制文件中合并模板类的相同成员函数吗?我有可能支持特定的功能,并依赖于一个类,可能需要一些额外的步骤里面的成员函数:根据实际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