C++ C++;内联函数是否强制复制其参数?

C++ C++;内联函数是否强制复制其参数?,c++,inline,C++,Inline,我最近决定整理一个头文件,它有很多定义,如: // api.h template< typename T> inline void func( T param ) { // stuff here } 是由优化器决定复制或不复制到哪里,还是标准对此有所规定 如果内联不复制函数参数,那么下面的行为会不会很糟糕 如果您更改参数,它将被复制。它与函数是否内联无关 是由优化器决定复制或不复制到哪里,还是标准对此有所规定 是的,这是优化器的任务。该标准只提到行为,而没有提到实现(有一些

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

// api.h
template< typename T>
inline void func( T param )
{
    // stuff here
}
是由优化器决定复制或不复制到哪里,还是标准对此有所规定

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

如果您更改参数,它将被复制。它与函数是否内联无关

是由优化器决定复制或不复制到哪里,还是标准对此有所规定

是的,这是优化器的任务。该标准只提到行为,而没有提到实现(有一些关于实现的参考,但很少)。而
inline
本身并不保证函数将内联,反之亦然,优化器可能会内联未声明为
inline
的函数
真正重要的是,通过值传递的参数不会因函数调用而改变。无论声明它是否内联,也不管它是否实际内联。

考虑到如今编译器在优化方面往往比人们聪明得多,
inline
通常不是指“inline this function”,而是指“此函数在翻译单元之间可能有多个(但仍然相同!)定义”。

注:内联声明模板函数是多余的。@真的吗?我只是假设它只有在相关调用发出时才会生成,而不是内联生成。但是声明内联的任何东西当然都不是一个硬性的保证,所以也许这就是为什么?当函数内联时,必须维护调用的语义。也就是说,对“by value”参数的修改不会反映在“调用者”中。@AK4749据我所知,模板函数是自动内联的(尽管这可能并不意味着内联)。@stefan一般来说,编译器不能更改可观察的行为(这称为“原样”规则)。然而,主要的例外是允许减少被复制和销毁的临时数据的数量,例如参数和返回值。基本上,该标准描述了创建对象副本的规则,但也允许优化不必要的副本(即使复制有副作用)。这是“现状”规则的一个显著例外。如果对象复制或销毁有副作用,优化可能会改变可观察的行为。
// 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 void change_value( int i ) {
    i++;
}

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