做资讯网站,网站设计制作公司大全,郑州市网站,推进门户网站建设工作宏太复杂#xff0c;所以弄出内联#xff0c;内联适合小函数#xff0c;把函数连到程序里面#xff0c;这样就直接用#xff0c;不需要调用#xff0c;但是它占用空间。
C推荐 const和enum替代宏常量 inline去替代宏函数
宏缺点#xff1a; 1、不能调试 2、没有类型安…宏太复杂所以弄出内联内联适合小函数把函数连到程序里面这样就直接用不需要调用但是它占用空间。
C推荐 const和enum替代宏常量 inline去替代宏函数
宏缺点 1、不能调试 2、没有类型安全的检查 3、有些场景下非常复杂,容易出错不容易掌握
1概念
以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调用建立栈帧的开销内联函数提升程序运行的效率。 如果在上述函数前增加inline关键字将其改成内联函数在编译期间编译器会用函数体替换函数的 调用。 查看方式 在release模式下查看编译器生成的汇编代码中是否存在call Add 在debug模式下需要对编译器进行设置否则不会展开(因为debug模式下编译器默认不 会对代码进行优化以下给出vs2013的设置方式) 2特性
编译器选择性内联长的代码一般是call调用短的频繁用的一般就会展开内联。一个很大的函数你弄成内联编译器也不会展开内联不会鸟你。 inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运行效率。 inline对于编译器而言只是一个建议不同编译器关于inline实现机制可能不同**一般建议将函数规模较小(即函数不是很长具体没有准确的说法取决于编译器内部实现)、**不是递归、且频繁调用的函数采用inline修饰否则编译器会忽略inline特性。下图为《Cprime》第五版关于inline的建议 inline不建议声明和定义分离分离会导致链接错误 m。因为inline被展开就没有函数地址了链接就会找不到内联函数不产生符号表 // F.h
#include iostream
using namespace std;
inline void f(int i);
// F.cpp
#include F.h
void f(int i)
{cout i endl;
}
// main.cpp
#include F.h
int main()
{f(10);return 0;
}
// 链接错误main.obj : error LNK2019: 无法解析的外部符号 void __cdecl
f(int) (?fYAXHZ)该符号在函数 _main 中被引用函数调用过程call到jmpjmp调到函数栈帧。内联函数没有栈帧直接在程序展开不需要调用。 所以 内联函数不要声明与定义分离直接在.h文件中定义调用时会直接展开在.cpp文件声明和定义分离是为了好看内联函数不需要分离。