美文网首页
宏定义define和内联函数inline区别

宏定义define和内联函数inline区别

作者: Coder_LRT | 来源:发表于2018-04-20 16:15 被阅读0次

内联函数是代码被插入到调用者代码处的函数。如同 #define 宏,内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。 宏定义不检查函数参数,返回值什么的,只是展开,相对来说,内联函数会检查参数类型,所以更安全。

内联函数和宏很类似,而区别在于,宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数,只是在需要用到的时候,内联函数像宏一样的展开,所以取消了函数的参数压栈,减少了调用的开销。你可以象调用函数一样来调用内联函数,而不必担心会产生于处理宏的一些问题。 

我们知道一般的函数调用都会通过call的方式来调用,hacker很容易对一个函数做手脚,如果是以inline的方式编译的,会把该函数的code拷贝到每次调用该函数的地方;而static会让生成的二进制文件中没有清晰的符号表,让逆向的人很难弄清楚逻辑

staticintisValidate(intid) __attribute__ ((always_inline));staticinlineintisValidate(intid);

定义:有函数的结构,但不具备函数的性质,类似于宏替换。代码中使用inline定义,能否形成内联函数,还要看编译器对内联函数体内部的定义的具体处理

1.使用inline

修饰的函数,在编译的时候,会把代码直接嵌入调用代码中。就相当于用#define 宏定义来定义一个add 函数那样!与#define的区别是:

1)#define定义的格式要有要求,而使用inline则就行平常写函数那样,只要加上inline即可!

2)使用#define宏定义的代码,编译器不会对其进行参数有效性检查,仅仅只是对符号表进行替换。

3#define宏定义的代码,其返回值不能被强制转换成可转换的适合的转换类型。

2.在inline加上static修饰符

只是为了表明该函数只在该文件中可见!也就是说,在同一个工程中,就算在其他文件中也出现同名、同参数的函数也不会引起函数重复定义的错误

 当然,内联函数也有一定的局限性。就是函数中的执行代码不能太多了,如果,内联函数的函数体过大,一般的编译器会放弃内联方式,而采用普通的方式调用函数。这样,内联函数就和普通函数执行效率一样了。

相关文章

  • 宏定义define和内联函数inline区别

    内联函数是代码被插入到调用者代码处的函数。如同#define宏,内联函数通过避免被调用的开销来提高执行效率,尤其是...

  • C++ ----带默认形参的函数,inline(),模板函数,动

    带有默认值形参的函数 inline 函数 和宏定义的区别,宏定义原样替换,inline(),先进行运算,后替换 ...

  • 内联函数与宏定义

    内联函数与宏定义 在C中,常用预处理语句#define来代替一个函数定义。例如:#define MAX(a,b) ...

  • 内联函数 inline

    内联函数的预编译指令 #define CG_INLINE static inline inlin...

  • C++ inline 和 #define

    inline是以代码膨胀(复制)为代价的,仅仅省去了函数调用的开销,从而提高函数的执行效率。 内联函数和宏的区别:...

  • 内联函数,重载函数,参数默认的函数

    内联函数 内联函数和宏差不多,要是时间不要空间;关键字inline。内联函数中,不能有复杂的控制语句,比如if或f...

  • C++查漏补缺

    1.内联函数 特点:(1)inline 定义 作用:(1)作用类似于宏定义 优点:(1)节省空间 缺点:(1)与全...

  • C++内联函数与C语言函数宏

    C++内联函数 什么是内联函数? 在函数的声明和定义前加一个 inline 关键字,这个函数就是内联函数。 通常会...

  • Ios面试复习--const、#define、static、ex

    1.const 与#define的区别 #define: --1.预编译(编译前处理) --2.宏能定义一些函数和...

  • C/C++知识点分享(29)

    1.宏与内联函数的区别 解析:内联函数和宏都是在程序出现的地方展开,内联函数不是通过函数调用实现的,是在调用该函数...

网友评论

      本文标题:宏定义define和内联函数inline区别

      本文链接:https://www.haomeiwen.com/subject/rlhzkftx.html