sheepdog中object_cache.c文件C语言语法tips

  1. !!(x) :转换x为bool值,x为0则返回0,不为0则返回1。
  2. offsetof宏
    使用offsetof宏需要包含stddef.h头文件。
    offsetof宏的定义如下:

    #define offsetof(type, member) (size_t)&(((type*)0)->member)
    
  3. container_of宏
    使用container_of宏需要包含linux/kernel.h头文件,container_of宏的定义如下所示:

    #define container_of(ptr, type, member) ({ \
    const typeof( ((type *)0)->member ) *__mptr = (ptr); \
    (type *)( (char *)__mptr - offsetof(type,member) );})
    

    container_of宏分为两部分,
    第一部分:const typeof( ((type )0)->member ) __mptr = (ptr); 通过typeof定义一个member指针类型的指针变量__mptr,(即__mptr是指向member类型的指针),并将__mptr赋值为ptr。
    第二部分: (type )( (char )__mptr - offsetof(type,member) ),通过offsetof宏计算出member在type中的偏移,然后用member的实际地址__mptr减去偏移,得到type的起始地址,即指向type类型的指针。
    第一部分的目的是为了将统一转换为member类型指针。

  4. static:希望该文件中的一些函数和变量只能被该文件中的函数使用,那么,你可以在该函数、变量的前面加上static,代表他们只能被当前文件中的函数使用 。
    A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
    B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
    C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;

  5. inline内联函数:内联函数是代码被插入到调用者代码处的函数。如同 #define 宏(但并不等同,原因下文),内联函数通过避免被调用的开销来提高执行效率,尤其是它能够通过调用(“过程化集成”)被编译器优化。和 #define 宏不同的是,内联函数总是对参数只精确地进行一次求值,从而避免了那声名狼藉的宏错误。换句话说,调用内联函数和调用正规函数是等价的,差别仅仅是更快。等效于更好阅读的,避免错误的宏。

  6. 全局变量以及全局变量与静态变量的关系: 顾名思义,全局变量是指能够在全局引用的变量,相对于局部变量的概念,也叫外部变量;同静态变量一样,全局变量位于静态数据区,全局变量一处定义,多处引用,用关键字“extern”引用“外部”的变量。全局变量也可以是静态的,在前面有过说明,静态全局变量的意义就是不让“外部”引用,是单个源文件里的全局变量,即是编译阶段的全局变量,而不是连接阶段的全局变量。

  7. 同步原语之原子操作

    #define atomic_read(v) (*(volatile int *)&(v)->counter)
    #define atomic_set(v,i) (((v)->counter) = (i))
    

    atomic_read(v)用于读取atomic_t变量*v的值
    atomic_set(v,i)用于把atomic_t变量*v设置为i
    atomic_add和atomic_sub属于读修改写操作,实现时需要加lock前缀。
    atomic_sub_and_test执行完减操作后检查结果是否为0。
    atomic_inc_and_test在递增后检查结果是否为0。
    atomic_add_return 不仅执行加操作,而且把相加的结果返回

  8. likely,unlikely宏与GCC内建函数__builtin_expect()

    #define likely(x) __builtin_expect(!!(x), 1)
    #define unlikely(x) __builtin_expect(!!(x), 0)
    

    引入了 likely 和 unlikely,目的是增加条件分支预测的准确性,cpu 会提前装载后面的指令,遇到条件转移指令时会提前预测并装载某个分支的指令。unlikely 表示你可以确认该条件是极少发生的,相反 likely 表示该条件多数情况下会发生。编译器会产生相应的代码来优化 cpu 执行效率。

  9. Union的大小为其内部所有变量的最大值,并且按照类型最大值的整数倍进行内存对齐。

  10. size_t是标准C库中定义的,应为unsigned int,定义在头文件stddef.h中。off_t类型用于指示文件的偏移量,常就是long类型,其默认为一个32位的整数,在gcc编译中会被编译为long int类型,其定义在unistd.h头文件中可以查看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值