例如
template< class T >
class Foo
{
public:
float MethodUseOfT()
{
return m_bar.CalculateSomething();
}
float MethodNoUseOfT()
{
float blah(0.f);
...
return blah;
}
private:
T m_bar;
};
class Bar
{
public:
float CalculateSomething();
}
如果有人制作 a Foo<Bar>
,大多数编译器是如何管理的;例如,他们通常会意识到MethodNoUseOfT
不引用模板参数并使用该信息来减少生成的机器代码的大小吗?
此外,如果 的内容MethodUseOfT
很大并且只有一行引用T
,编译器是否会再次尝试重用为该方法的其余部分生成的机器代码?
也许。
Microsoft C++ 可以选择合并相同的函数(当然Foo<int>::MethodNoUseOfT()
与 相同Foo<double>::MethodNoUseOfT()
)。
通常,此选项不符合标准(因为从函数模板生成的两个普通函数需要具有不同的地址,即使它们在其他方面相同)。但是,这不适用于这种情况,因为无法获得成员函数的地址(指向成员函数的指针与地址非常不同,而且比地址复杂得多)-因此链接器也许能够做到。
如评论中所述,唯一确定的方法是检查编译器+链接器的输出。
确定的简单方法是编写如下内容:
class FooBase
{
public:
float MethodNoUseOfT()
{
float blah(0.f);
...
return blah;
}
};
template< class T >
class Foo : public FooBase
{
public:
float MethodUseOfT()
{
return m_bar.CalculateSomething();
}
private:
T m_bar;
};
class Bar
{
public:
float CalculateSomething();
}
如果这样做,您甚至可以将 的实现移动MethodNoUseOfT
到 CPP 文件中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句