static inline

作者: 面糊 | 来源:发表于2016-08-25 14:26 被阅读1426次

在公司的代码中, 看到前辈写了一个判断对象是否为空值的方法, 瞬间被这个static inline弄得晕头转向, 由于C和C++没有学的很深入, 各种百度乎明白了这个关键字的作用, 代码如下:

static inline BOOL IsEmpty(id thing) {
    return thing == nil || [thing isEqual:[NSNull null]]
    || ([thing respondsToSelector:@selector(length)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [(NSArray *)thing count] == 0);
}
  1. 首先重温一下static的作用:

    • static是静态修饰符, 由他修饰的变量会保存在全局数据区
    • 普通的局部变量或者全局变量, 都是有系统自动分配内存的, 并且当变量离开作用域的时候释放掉
    • 而使用static修饰的变量, 则会在程序运行期都不会释放, 只有当程序结束的时候才会释放
    • 因此对于那些需要反复使用的变量, 我们通常使用static来修饰, 避免重复创建导致不必要的内存开销
  2. static inline

    • inline函数, 即内联函数, 他可以向编译器申请, 将使用inline修饰的函数内容, 内联到函数调用的位置
    • 内联函数的作用类似于#define, 但是他比#define有一些优点
      • 相对于函数直接调用: inline修饰的函数, 不会再调用这个函数的时候, 调用call方法, 就不会将函数压栈, 产生内存消耗
      • 相对于宏:
        • 宏需要预编译, 而内联函数是一个函数, 不许要预编译
        • 编译器调用内联函数的时候, 会检查函数的传参是否正确, 但是宏就不会提醒参数
    • 但是内联函数的使用也有限制
      • 内联函数只能对一些小型的函数起作用, 如果函数中消耗的内存很大, 比如for循环, 则内联函数就会默认失效
    • 使用static的原因
      • 函数在运行过程中也会分配内存, 但是由于static的存在, 因此就和修饰变量类似, 他只会开辟一块内存空间
  3. 建议

    • 对于一些经常用的做判断的小方法, 可以使用内联函数, 避免使用#define的过于臃肿

相关文章

  • const,static,extern简介

    解释关键字 static,const,inline,Static,inline,volatilestatic 修饰...

  • static, static inline, extern, r

    static, static inline, extern, register, static const htt...

  • static inline

    在公司的代码中, 看到前辈写了一个判断对象是否为空值的方法, 瞬间被这个static inline弄得晕头转向, ...

  • static inline

    2019/07/16今天在看DPDK负载均衡的实例代码中,通过函数跳转,看到官方API后,发现了static in...

  • static inline

    我们知道一般的函数调用都会通过call的方式来调用,hacker很容易对一个函数做手脚,如果是以inline的方式...

  • 结构体

    这里CG_INLINE是一个宏:#define CG_INLINE static inline,这是系统的一...

  • 内联函数 inline

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

  • iOS OC内联函数 inline

    inline 在iOS中的一些框架中,static inline是经常出现的关键字组合. static自不用多说,...

  • iOS OC中内联函数inline

    inline 在iOS中的一些框架中,static inline是经常出现的关键字组合。 static自不用多说,...

  • static inline 延伸

    此内容分为两个知识点: 0x01 static 字面意思为静态,一直在那里 修饰变量 main函数之前初始化,并且...

网友评论

  • 0x70e8:请教下,“相对于函数直接调用: inline修饰的函数, 不会再(在?)调用这个函数的时候, 调用call方法, 就不会将函数压栈, 产生内存消耗”,如果不压栈(不进行方法调用),是因为直接把函数的汇编码织入到调用者的源码中了吗?
  • 嘴爷:受教了

本文标题:static inline

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