C ++内联函数强制其参数被复制?

时间:2013-04-25 16:43:11

标签: c++ inline

我最近决定整理一个有很多定义的头文件:

// api.h
template< typename T>
inline void func( T param )
{
    // stuff here
}

所以我想把它变成:

// api.h
#include "api_details.h"
template< typename T>
inline void func( T param )
{
    return details::func( param );
}

// api_details.h
namespace details {
    template< typename T>
    inline void func( T param )
    {
        // stuff here
    }
}

希望inline不会为我执行的额外副本增加费用。

虽然&#39; C++ do inline functions prevent copying?&#39;似乎暗示不会发生复制,这个问题就出现了:

如果内联没有复制功能参数,那么以下行为不会很糟糕吗?

inline void change_value( int i ) {
    i++;
}

...
int x=5;
change_value(x);
assert(x==5);

只是优化器决定在哪里复制,或者标准是否对此有所说明?

1 个答案:

答案 0 :(得分:11)

  

如果内联不复制函数参数,那么下面的行为会不会很糟糕?

如果您更改参数,它将被复制。它与inline的功能无关。

  

只是优化器决定在哪里复制,或者标准是否对此有所说明?

是的,这是优化器的任务。标准仅提及行为,而不是实现(有一些关于实现的参考,但只有少数参考)。并且inline本身并不保证函数将被内联,反之亦然,优化器可能会将未声明为inline的函数包含在内。
真正重要的是函数调用不会改变按值传递的参数。无论是否inline声明它,无论它是否实际被内联 鉴于现在的编译器在优化方面往往更加聪明,inline通常意味着不“内联此函数”,而是“此函数可能在翻译单元中具有多个(但仍然相同!)定义”。