gpt4 book ai didi

c++ - 在 header 中定义函数是否总是使编译器将其视为内联?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:04:43 24 4
gpt4 key购买 nike

我刚刚了解到,在类的头文件中定义一个 C++ 函数会使该函数内联。但我知道将 inline 关键字放在函数旁边只是一个建议,编译器不一定会遵循它。这对于 header 定义的 C++ 函数是否相同?独立 C++ 函数和作为类一部分的 C++ 函数在行为上是否存在差异?

最佳答案

“在类的头文件中定义一个 c++ 函数使函数内联”

那不是真的。在类定义中定义一个函数(也就是说,提供函数体而不只是一个声明)使其成为内联的。通过“使其内联”,我的意思是它与给它 inline 关键字相同。但是类定义不必在标题中,标题可以包含类定义以外的其他内容。

所以在这个例子中,函数 foo 是隐式内联的。函数 bar 不是隐式内联的:

struct Foo {
void foo() {}
void bar();
};

void Foo::bar() {}

“将内联关键字放在函数旁边只是一个建议,编译器不一定会遵循它”

inline 有两个作用。其中之一是对编译器的提示,它可以忽略。另一个不是可选的,总是有它的作用。 “提示”是建议编译器用函数本身的代码拷贝替换对该函数的调用。

保证的效果是内联函数可以在多个翻译单元中定义,并且将它们链接在一起,而不会出现多重定义错误,并且除了一个拷贝之外的所有拷贝都被链接器删除。因此,如果上面的示例出现在多个翻译单元之间共享的头文件中,则 bar 需要明确标记为内联。否则,链接器将发现 bar 的多个定义,这是不允许的。

尽管名称如此,C++ 中的 inline 主要是关于第二个强制效果,而不是第一个可选效果。现代优化编译器对于哪些调用应该内联有自己的想法,并且在做出决定时不会过多关注 inline 。例如,我已经看到它在适度优化级别的 gcc 中有影响,但在低级别几乎没有内联,而在高级别几乎所有内容都是(如果定义在编译调用时可用)除非它使函数太大了。

函数是在头文件中定义还是在 cpp 文件中定义对它本身绝对没有影响。您可以放心地想象,#include 所做的是在编译器看到它之前,将头文件复制并粘贴到预处理器中的 cpp 文件中。如果函数在调用它的同一翻译单元中定义,则函数代码可由编译器内联。如果它们在不同的翻译单元中,则代码不可用,调用只能由链接器内联,并进行全程序优化或类似操作。 “翻译单元”或多或少意味着“一个 cpp 文件,在将所有 header 复制并粘贴到其中之后”。

关于c++ - 在 header 中定义函数是否总是使编译器将其视为内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1861581/

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