我最近决定整理一个有很多定义的头文件:
// 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);
只是优化器决定在哪里复制,或者标准是否对此有所说明?
答案 0 :(得分:11)
如果内联不复制函数参数,那么下面的行为会不会很糟糕?
如果您更改参数,它将被复制。它与inline
的功能无关。
只是优化器决定在哪里复制,或者标准是否对此有所说明?
是的,这是优化器的任务。标准仅提及行为,而不是实现(有一些关于实现的参考,但只有少数参考)。并且inline
本身并不保证函数将被内联,反之亦然,优化器可能会将未声明为inline
的函数包含在内。
真正重要的是函数调用不会改变按值传递的参数。无论是否inline
声明它,无论它是否实际被内联
鉴于现在的编译器在优化方面往往更加聪明,inline
通常意味着不“内联此函数”,而是“此函数可能在翻译单元中具有多个(但仍然相同!)定义”。