gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:36:24 26 4
gpt4 key购买 nike

我最近决定整理一个包含大量定义的头文件,如下所示:

// 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++ do inline functions prevent copying?”中的答案' 似乎暗示没有复制发生,出现了这个问题:

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

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

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

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

最佳答案

if inlining doesn't copy the function parameters, then wouldn't the following behave badly?

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

is it just the optimizer that decides where to copy or not, or does the standard say anything about that?

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

关于C++ 内联函数会强制复制其参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16220330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com