内联函数、C/C++的相互调用
1.inline内联函数
inline关键字加上:不生成符号定义了
inline:编译阶段
调用点---->直接代码展开
1.1inline函数和宏有什么区别?
1.inline函数在编译阶段处理:有类型检查和安全检查,安全
2.宏:在与便于阶段,直接文本替换,不安全
内联函数可以理解为:更安全的宏
1.2inline函数和static修饰的函数有什么区别
1.inline直接代码展开,没有开栈和清栈的开销,不生成符号导致---->本文件可见
2.static有开栈和清栈的开销,生成符号,只是global–>local 变成了只有当前文件可见
(所有文件只分为global和local,global整个项目下,全部文件可见,local只有本文件可见)
1.3为什么不把所有函数默认处理成inline
inline函数,直接代码展开,没有开栈和清栈的开销,效率高,那为什么不把所有函数默认处理成inline?
inline函数的缺陷:
以代码膨胀为代价(以空间换时间),如果设置不恰当,空间占用率高,而且效率也不高。
inline使用建议:
1.函数执行的开销 < 函数开栈清栈的开销--------->建议
2.函数执行的开销 >> 函数开栈清栈的开销 ----->不建议
1.4内联的限制
1.只在release版本生效
2.inline只是给编译器的一个建议,具体处不处理,是编译器来决定的
- 哪些函数,编译器是一定不会设置为内联的?
1>.递归。因为编译器不知道应该展开多少次
2>.for while循环。
3>.switch分支。
3.inline是基于实现的,不是基于声明的。(要设计在定义点,而不是声明点)
4.inline的实现应该写在头文件中,不要放在源文件中
2.C/C++的相互调用
extern “C”
{
CODE-LIST
}
CODE-LIST ----->处理方式以c的规则来处理
1.C++中调用C函数(extern “C”)
2.C语言中调用C++(向前兼容,把c++中的定义点设置为以C处理)
无论是哪种情况,都在C++文件中,将规则点(定义点/声明点)设置为以C处理
- 如果不允许改变c++源文件怎么办?
加个中间层,如下图: