记录 C 语言相关小知识。

关键字

volatile

1
volatile unsigned long lru_clock; /* Server global current LRU time. */

参考 C 语言标准谈谈 C/C++ 中的 volatile 可知:对 volatile 变量的访问,编译器不能做任何假设和推理,都必须按部就班地与「内存」进行交互。

结构体

结构体内的冒号

1
2
3
4
5
6
7
typedef struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:24;
    int refcount;
    void *ptr;
} robj;

用冒号限定该 field 所占的位数。

编译器相关

__builtin_expect

GCC (version >= 2.96) 提供 __builtin_expect() 的支持,允许程序员将最有可能执行的分支告诉编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降。

一般的使用方法是使用 likelyunlikely 封装该指令,例如:

1
2
3
4
5
6
7
#if __GNUC__ >= 3
#define likely(x) __builtin_expect(!!(x), 1)    /* x 很可能为真 */
#define unlikely(x) __builtin_expect(!!(x), 0)  /* x 很可能为假 */
#else
#define likely(x) (x)
#define unlikely(x) (x)
#endif

此处两次取非的作用是将 x 强转为“布尔类型”(0 or 1 in C)。