我正在读Alex Graves的rnnlib。
在他的代码中有许多静态函数模板,它们不是类成员方法,而是定义为static
,而有些则不是。(见下文)
Helpers.hpp
的一些代码片段:
...
// static
template <class R> static void sort(R& r)
{
sort(boost::begin(r), boost::end(r));
}
// static
template <class R> static void reverse_sort(R& r)
{
sort(boost::rbegin(r), boost::rend(r));
}
// non static
template <class R> pair<typename range_value<R>::type, typename range_value<R>::type> minmax(const R& r)
{
pair<typename range_const_iterator<R>::type, typename range_const_iterator<R>::type> p = minmax_element(boost::begin(r), boost::end(r));
return make_pair(*p.first, *p.second);
}
// static
template <class R> static void bound_range (R& r, const typename boost::range_value<R>::type& minVal, const typename boost::range_value<R>::type& maxVal)
{
for (typename range_iterator<R>::type it = boost::begin(r); it != boost::end(r); ++it)
{
*it = bound(*it, minVal, maxVal);
}
}
...
为什么其中一些全局功能模板定义为静态,而有些不?
答案 0 :(得分:4)
在该上下文中,static
关键字引用静态链接,即该函数仅在定义它的翻译单元中可见。
现在,作为头文件中定义的函数,static
关键字的效果将是编译器将在包含头文件的每个翻译单元中为该函数生成代码(并且实际使用该文件功能)。此外,该功能将被内联。
对于模板函数,我会说使用static
,inline
或无关键字会产生相同的结果;实际上,在所有情况下,函数都将被内联,并且不会引发多重定义错误。
所以,有趣的问题可能是“为什么在非模板函数上使用static
”。
答案 1 :(得分:-1)
由于使static
或不与链接有关,我会假设此代码的作者希望这些全局函数静态链接而不是动态链接(如果这是一个库)。
答案 2 :(得分:-1)
使用静态函数是我们的代码编译然后执行静态代码。 因此,所有静态函数的链接都在编译时完成。