C++ Visual Studio 2010-函数未内联-为什么?

C++ Visual Studio 2010-函数未内联-为什么?,c++,performance,visual-studio-2010,inline,C++,Performance,Visual Studio 2010,Inline,我有一个计算内积的通用函数: template < typename _A > inline typename _A::value_type innerProduct( const _A& A, const typename _A::index_type& row0,

我有一个计算内积的通用函数:

template < typename _A >
    inline typename _A::value_type innerProduct( const          _A&             A,
                                                 const typename _A::index_type& row0,
                                                 const typename _A::index_type& row1,
                                                 const typename _A::index_type& col,
                                                 const typename _A::size_type&  n )
    {
        typedef typename _A::value_type value_type;
        typedef typename _A::index_type index_type;

        value_type sum = value_type( );

        for( index_type i = 0; i < n; ++i )
        {
            sum += A( row0, i ) * A( row1, i );
        }

        return sum;
}
模板
内联类型名称A::值类型innerProduct(常量A&A,
const typename _A::index_type&row0,
const typename _A::index _type&row1,
常量类型名称A::索引类型和列,
常量类型名称(A::大小(类型(&n))
{
typedef typename _A::value_type value_type;
typedef typename _A::index_type index_type;
值\类型和=值\类型();
对于(索引类型i=0;i
在计算cholesky分解时,我多次调用该函数。因为函数调用的开销很大(~11%!),所以应该避免。在我的简单世界里,我认为函数太小了,编译器会将其内联。我多次检查编译器选项,但我认为它们很好。我使用例如/Ox/O2/Ob2/GL。 在调用函数之前,我还检查了该函数是否对编译器可见。但函数从来都不是内联的。唯一可行的方法是使用关键字uu forceinline显式定义函数

那么,我必须告诉编译器什么样的选项来内联函数呢?
如果函数是内联的,编译器的标准是什么?

当Microsoft没有记录
inline
关键字时,函数可能没有内联的具体原因。(我能找到的最接近的是的文档。)
inline
关键字只是一个提示,编译器使用试探法来确定内联是否是一种值得优化的方法。在许多情况下,内联可能会影响性能,例如,如果它增加寄存器压力

您已经找到了这个问题的解决方案:使用
\uu forceinline
关键字告诉编译器您更了解这个问题。要在调用站点设置条件,请创建两个版本的
innerProduct
函数,一个带有
\u forceinline
,另一个没有。看起来您可以通过调用前者来实现后者。比如:

__forceinline value_type innerProduct_forceinline(...) {
    ...
    return sum;
}

inline value_type innerProduct(...) {
    return innerProduct_forceinline(...);
}

开销是11%的空间(代码大小)还是执行时间?执行时间是否取决于
n
?在你的情况下,
n
有多大?编译器如何知道编译时
n
非常小(在调用站点是常数)?当函数用u forceinline(=快)或不(=慢)声明时,执行时间的开销为11%。在这两种情况下,参数n始终在相同的(非常量)范围内。编译器通常不使用诸如
for
while
之类的语句来内联函数。如果调用站点中的
n
始终是一个常量,则可以将其用作模板参数,并将函数递归(在这种情况下,由于模板参数更改,它会执行内联递归函数)。谢谢您的反馈。避免使用_forceinline关键字的原因是该函数非常通用,可以在不同的项目中使用。所以我不知道每次内联函数是否有意义。创建两个版本的函数,一个有
\uu forceinline
,一个没有?您可以从非版本调用
\uu forceinline
版本,以避免必须实现它两次。哦,是的……非常好而且简单的想法:)我认为这解决了问题*facepalm