• 内联函数(inline function)


    关键词inline修饰的函数,叫作内联函数

    • 编译器将函数调用直接展开为函数体代码
    #include <iostream>
    using namespace std;
    
    inline void func() {
    	cout << "func()" << endl;
    }
    
    inline int sum(int v1, int v2) {
    	return v1 + v2;
    }
    
    int main() {
    	func();
    
    	int c = sum(10, 20);
    	cout << c << endl;
    
    	getchar();
    	return 0;
    }
    
    • 搜一下跳转地址,发现确实是直接展开为函数体代码

    一旦变成内联函数时,一有调用就会不停的替换(展开);而一般的函数,函数的实现只有一份

    *一下被替换,展开为四份

    一般函数调用开始时开辟栈空间,结束时回收;内联函数直接展开,不存在函数调用(cout << "func()" << endl;直接执行这个操作)

    • 可以减少函数调用的开销;会增大代码体积
    inline void func() {            
    	cout << "func()" << endl;    //一般的函数这里只保留一份
    }
    
    int main() {
    	func();            //替换为这一句cout << "func()" << endl;
            func();            //替换为这一句cout << "func()" << endl;
            func();            //替换为这一句cout << "func()" << endl;
    	func();            //替换为这一句cout << "func()" << endl;
    
    	getchar();
    	return 0;
    }
    

    什么时候使用内联

    1.函数代码体积不大
    2.经常调用的函数
    3.尽量不要内联超过10行代码的函数
    4.有些函数即使声明为inline,最终编译器也不一定把它变成内联,比如递归函数
    5.inline是尽量建议编译器去优化

    VS看看内联的本质

    release x86模式:发布模式,编译器做最大优化
    不是内联函数也会变成内联
    如要要看见inline的区别,需要右键解决方案-属性-优化 禁止-内联函数扩展 改成任何适用项

    发现不存在调用函数call

    用IDA打开看,发现内联函数的声明与过程都不见了,直接把函数调用替换成函数里面的内容

    func();            //替换为这一句cout << "func()" << endl;
    

    内联函数与宏类似,都有一个替换。宏是文本替换。

    • 不要使用宏,使用内联
    #include <iostream>
    using namespace std;
    
    #define add(v1, v2) v1 + v2    //宏,左边替换成右边
    
    int main() {
    
    	int c = add(10, 20);
    
    	cout << c << endl;
    
    	getchar();
    	return 0;
    }
    

    c++表达式可以被赋值

    int a =1;
    int b =2;
    (a = b) = 4;    //赋值给了a
    
  • 相关阅读:
    若不曾忘记,便不必追忆
    C# 随机生成中文字符串
    C# SQLiteHelper
    C# SQLHelper
    C# Microsoft SQL Server 操作
    C# Excel 操作
    C# XML文件操作(续)
    C# 遍历XML文件,添加,更新,删除节点
    MES系统简介
    SQL Server 存储过程(转)
  • 原文地址:https://www.cnblogs.com/sec875/p/12253745.html
Copyright © 2020-2023  润新知