我应该何时inline在C++中为函数/方法编写关键字?
看到一些答案,一些相关的问题:
我应该何时不写在C++函数/方法关键字"内联"?
什么时候编译器不知道何时使函数/方法'内联'?
当一个应用程序为函数/方法写入"内联"时,是否多线程是否重要?
在C++中使用内联函数的优点/缺点是什么?我看到它只会提高编译器输出的代码的性能,但是使用今天的优化编译器,快速CPU,大容量存储器等(不像1980年那样<内存稀缺,一切都必须适合100KB内存)什么他们今天真的有优势吗?
我有两个问题:
1)为什么在C++中允许指向内联函数的指针?我已经读过内联函数的代码只是被复制到函数调用语句中,内联函数中没有编译时内存分配.那么为什么内联函数存在一个指针,因为内联函数没有固定的内存地址?
2)考虑以下代码:
inline void func()
{
int n=0;
cout<<(&n);
}
Run Code Online (Sandbox Code Playgroud)
它是否应该打印不同值的n每次func()调用地址?[因为我认为每次复制内联函数代码时,必须重新分配局部变量(而在正常函数的情况下,重新初始化会发生)]
我是初学者,为了加强我的概念,我问了这个问题.如果我在任何地方都错了,请纠正我.
我知道这个函数很简单,它将被内联:
int foo(int a, int b){
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
但我的问题是,编译器无法自动检测到这与以下内容相同:
int foo(const int a, const int b){
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
既然可以检测到这一点,为什么我需要在const任何地方输入?我知道inline由于编译器的进步,关键字已经过时了.是不是该const做同样的时间?
这部分gcc手册非常模糊,我无法理解重复尝试后forceinline属性的用法.
我正在定义一个对象和某些函数来操纵该对象.这些函数中很少有可以使用原子指令,我希望编译器内联这些函数.但是,我不想在头文件中编写这些函数,并在Linux内核中使用"静态内联"声明它们.
有没有办法强制gcc从另一个翻译单元内联函数?
使用现代编译器,声明内联函数对性能有任何影响吗?
也就是说,面对在标题或源文件中定义内联函数的选项,两者之间是否有任何区别?
在这个SO问题中,何时使用内联函数而何时不使用它?,接受的答案有几个原因.
摘录:
做:
inline:更快的代码和更小的可执行文件(更多的机会留在代码缓存中)别:
这个建议来自7年前,我读过这些天内联词被忽略了,编译器决定要内联什么.
问题:
C++(和其他各种语言)支持内联函数.如果我想要一个函数内联,我必须inline在声明中使用关键字.对我而言,这种接缝非常不直观:为什么我不能inline在调用函数时使用它?例:
void foo(){...}
inline foo();
Run Code Online (Sandbox Code Playgroud)
代替
inline void foo(...){...}
foo();
Run Code Online (Sandbox Code Playgroud)
这将允许我仅在特定位置内联函数而无需复制函数.此外,每个功能都可以内联,这将使机制更加灵活.为什么这不支持是有原因的吗?
void foo(void) {}我有一个我希望内联的函数(让我们称之为它)。但是我在 .cpp 文件中定义了它。
我无法将该函数移动到标头,因为它正在使用 .cpp 中的其他函数。
编辑:
下面的代码就像真实的代码一样不使用 C++ 功能。我可以明确补充:
#ifdef __cplusplus
extern "C"
#endif
Run Code Online (Sandbox Code Playgroud)
如果我想将下面的代码转换为 c99,我只需要更改我的项目属性(或 makefile,如果您愿意)而不是代码。我也在询问c++,因为它可以解决我的问题,而c99不能。
因此我的问题中的 C 和 C++ 标签是合理的。代码是可移植的,
请参阅:When to use extern "C" in C++?
编辑#2
好吧,我明白我必须将foo()定义放在头文件中。如何在不将它们移动到头文件的情况下调用func_a()和func_b()from ?foo()有什么解决方法吗?
示例
文件.c/.cpp:
int func_a (int a, int b, int c) {/*...*/};
double func_b (double a, double b, double c) {/*...*/};
void foo (int a, double b) { // unction definition
//...
int myInt …Run Code Online (Sandbox Code Playgroud)