2

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

// 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不会增加我正在执行的额外副本的成本。

尽管' C++ 中的答案是否内联函数会阻止复制?' 似乎暗示没有复制发生,这个问题出现了:

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

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

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

只是优化器决定在哪里复制,还是标准对此有任何说明?

4

1 回答 1

11

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

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

只是优化器决定在哪里复制,还是标准对此有任何说明?

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

于 2013-04-25T16:47:39.997 回答