ixr*_*ron 6 c++ compiler-construction
当您使用具有多种方法的模板(如vector)并编译代码时,编译器是否会丢弃未使用方法中的代码?
除非使用模板,否则不会实例化模板,因此实际上没有要丢弃的代码.
标准说(14.7.1/10)
实现不应隐式实例化函数模板,成员模板,非虚拟成员函数,成员类或不需要实例化的类模板的静态数据成员.如果虚拟成员函数不会被实例化,则实现是否隐式实例化类模板的虚拟成员函数是未指定的.在默认参数中使用模板特化不应导致模板被隐式实例化,除了可以实例化类模板,其中需要其完整类型来确定默认参数的正确性.在函数调用中使用默认参数会导致默认参数中的特化被隐式实例化.
因此,如果您可以避免将模板的成员函数设置为虚拟,则编译器将不会为它们生成任何代码(如果编译器足够智能,那么它也可能适用于虚函数).