我知道inline是对编译器的提示或请求,用于避免函数调用开销.
那么在什么基础上可以确定函数是否是内联的候选者?在哪种情况下应该避免内联?
根据C++规范,以下两个类是否等效定义?
class A
{
void f()
{
}
};
class B
{
inline void f()
{
}
};
Run Code Online (Sandbox Code Playgroud)
即,将"内联"限定符放在类定义中定义的成员函数上是完全冗余的吗?
跟随问题:假设它是多余的,对于代码样式,保留"内联"标记是否明智,以便未来的开发人员意识到该函数应该内联,并且不会删除其他地方的定义并删除内联?
谢谢 :)
在C++中,关键字"inline"有两个用途.首先,它允许定义出现在多个翻译单元中.其次,它提示编译器应该在编译的代码中内联函数.
我的问题:在代码由GCC和锵/ LLVM产生,并关键字"内联"有任何一个功能是否被内联轴承?如果是,在什么情况下?或者暗示完全被忽略了?请注意,这不是语言问题,而是特定于编译器的问题.
inlineC++中的关键字允许在头文件中定义函数,以便编译器可以实际内联它们或只保留函数的一个副本.这允许通过直接在头文件中定义函数来减少编译单元的数量,其优点通常是编译时间快几倍,并且执行速度可能更快.
为什么这个相同的模式不能应用于命名空间范围变量,而C++中的函数在将它们视为特殊指针时实际上是命名空间范围变量?
我能想到的是使用内联函数的静态局部变量.
inline std::string& Hello__() { //Edit: Added the &
static std::string hello("Hello");
return hello;
}
#define Hello (Hello__())
Run Code Online (Sandbox Code Playgroud)
编辑:我想澄清我的问题如下.
我正在使用术语'inline'作为编译器理解的内容.它允许具有相同名称的相同定义在多个编译单元中,允许标题中的定义."内联"的主要优点不是宏功能所具有的性能优势,而是编译单元数量减少所需的编译时间更短.它可能会短几倍.
我确实提出了一个解决方案,让变量像内联函数一样工作.但我仍然在寻找更好的方法来做到这一点.
为了清楚地说明,我想要实现的是在标题中定义名称空间范围变量,就像内联函数一样,以便使构建过程尽可能简单快速.
EDIT2:谢谢你的链接通过DYP评论.我刚读过这个提案,这正是我的想法.该提案的现状如何?
引自该提案:
然而,希望存在全局唯一对象而不必选择用于定义它的单个翻译单元并不罕见.实际上,做出这种选择通常需要使用非平凡的预处理器宏,单独编译的库或两者.但是,C++的一个优势是它支持headeronly库开发的能力.在这种情况下,缺乏定义内联变量的能力对库设计造成了重大限制.
我正在阅读ODR,正如规则所说"In the entire program, an object or non-inline function cannot have more than one definition",我尝试了以下内容......
file1.cpp
#include <iostream>
using namespace std;
inline int func1(void){ return 5; }
inline int func2(void){ return 6; }
inline int func3(void){ return 7; }
int sum(void);
int main(int argc, char *argv[])
{
cout << func1() << endl;
cout << func2() << endl;
cout << func3() << endl;
cout << sum() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
file2.cpp
inline int func1(void) { return 5; } …Run Code Online (Sandbox Code Playgroud) 读取旧的答案对我什么时候应该写关键字"内联"的函数/方法?说的是:
据说内联提示您认为该函数应该内联到编译器.这可能是在1998年,但十年后编译器不需要这样的提示.更不用说人类在优化代码时通常是错误的,因此大多数编译器都会忽略"提示".
这个答案是在2009年发布的,所以我想最终想出来:
inline用户指定的提示并且只是自动执行此操作?inline提示只停留于提供向后兼容性?1.这样这个答案是不正确的?我有一个关于c/c ++中的内联函数和参数复制的问题.让我们假设我想在没有内联说明符的情况下运行此函数:
void my_func(int param)
{
my_inner_func(param);
}
Run Code Online (Sandbox Code Playgroud)
param将首先复制到my_func然后再复制到my_inner_func.如果函数my_func是inline,那么编译器只会复制param一次my_inner_func参数或两次.我将非常感谢所有的帮助.
编辑:如果它有所不同,我想请求c和c ++的解释.