static inline对函数的作用

在阅读代码的时候我们经常会看到这样的函数原型:

static inline char sdsReqType(size_t string_size) {
    if (string_size < 32)
        return SDS_TYPE_5;
    if (string_size < 0xff)
        return SDS_TYPE_8;
    if (string_size < 0xffff)
        return SDS_TYPE_16;
    if (string_size < 0xffffffff)
        return SDS_TYPE_32;
    return SDS_TYPE_64;
}

在这里为什么要把函数定义成static inline呢?
inline的用途
内联函数: 以inline修饰的函数,在编译时会在调用内联函数的地方展开,没有函数压栈的开销,提高程序运行效率。inline只是对编译器的一个建议,编译器会自动去优化。inline必须和函数定义放在一起才有作用,放在声明前不起 作用。
那么为什么还需要用static修饰呢?
对于内联函数,不能像普通函数那样,直接在.h文件里面声明下,源文件里面定义下,然后其他C文件就可以调用。而加上static的前缀后,就解决了这个问题。
具体原因如下:
如果inline函数在两个不同的文件中出现,也就是说一个.h被两个不同的文件包含,则会出现重名,链接失败。
所以static inline 的用法就能很好的解决这个问题,使用static修饰符,函数仅在文件内部可见,不会污染命名空间。可以理解为一个inline在不同的.C里面生成了不同的实例,而且名字是完全相同的。
总结:static和inline联合使用既能提高程序的运行效率又能让其声明后被多个.c文件使用。
注意: inline只用于内容重复,但代码很短的函数,避免出栈入栈消耗额外的时间,对于复杂函数,不建议用inline,因为他在每个调用位置都会复制编译,会让代码变得非常长,被100个位置调用,该函数的内存增加100倍,而且现在电脑非常快,inline其实根本没必要,一般只有几行的函数才有理由用inline,因为他的出栈入栈跳转相对本身代码运行时间的比例较高,而长代码就微乎其微。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值