redis原始碼學習 程式設計技巧

2021-07-24 03:26:45 字數 2147 閱讀 2728

#巨集的用法

#define version "6.0.1"

#define datetime "datetime"

//將變數 s 以字串的形式輸出

#define xstr(s) __str(s)

#define __str(s) #s

//使用巨集拼接字串

#define echo_str ("jemalloc-" xstr(hello) "." xstr(world) "." xstr(version))

//printf ("%s\n", echo_str); 將輸出 jemalloc-hello.world.version

//同時,還可以使用如下方式拼接字串

char* buf = version datetime;

printf ("%s\n", buf); //將輸出buf的值為 6.0.1datetime

上述**中,為什麼需要使用兩個巢狀巨集函式來完成字串是輸出呢,看如下例子就能知道結果:

printf ("%s\n", xstr (version)); //輸出 "6.0.1"

printf ("%s\n", _str(version)); //輸出 version

後者不會對引數進行巨集替換,直接當做字串輸出,前者才對引數進行巨集替換

#零長陣列和變長陣列

##零長陣列

在 gnu c 中允許零長陣列,在 c++ 和 ansi c 中都不允許使用,如下所示:

typedef struct sds ;
此結構體中包含乙個長度為零的陣列,但是它的使用必須滿足一定的條件。

檢視該結構體的大小發現,長度為 0 的陣列長度為 0, sizeof (sds) == 8

在 iso c99 中,使用變長陣列也可以實現同樣的功能。

##變長陣列

typedef struct sds sds;

sds msds = }; //此結構體的變數只能在函式體外部定義和初始化,否則會報錯

//error: non-static initialization of a flexible array member

//error: (near initialization for 'msds')

通過 sizeof 檢視大小

sizoef (sds) : 8

sizeof (msds): 8

變長陣列是不完全資料型別,不能使用 sizeof 獲取它的大小。

這種c99中伸縮陣列(flexible array),是對結構體功能的擴充套件。在結構體的原型申明時,可以申明乙個沒有指定陣列長度的陣列,在使用是,通過malloc動態決定結構體變數的陣列大小。

在 c 中申明乙個陣列

int arr[num];
num的值一般是乙個常量,且是不變的,但是在邊長陣列的長度可以在執行時指定。如下所示:

int i;

scanf ("%d", &i);

int arr[i];

上述的陣列長度就是在執行時決定的,這種型別的陣列就稱之為變長陣列。

可參考文件

sds * psds = (sds*)malloc (sizeof (sds) + length + 1);

psds->len = length;

psds->free = 0;

memcpy (psds->buf, str, length);

psds->buf[length] = '\0';

在 redis 原始碼中,sdsnew 函式每此建立乙個結構體後,都是返回的 psds->buf 進行處理,這樣,結構體往後偏移了 sizeof(struct sds)個位元組(即 8 個位元組),所以每次在對 buf 處理的時候,先轉成 sds 結構體時,都需要往前偏移 8 個位元組,得到 len 和 free。

void sdslen (void * s) 

redis原始碼學習筆記

目錄 1 從資料結構開始 圖為原始碼,附帶個人簡單分析 a 動態字串 檔案 sds.h sds.c 前言 s sizeof struct sdshdr 的解釋為buf為柔性陣列,不占用空間,僅僅為偏移量,所以s指標向後退乙個結構體大小為結構體位址所在。分析 這個結構是整個動態字串的基礎,sds為 s...

redis原始碼學習 skiplist

圖中所示,跳躍表與普通鍊錶的區別在於,每乙個節點可以有多個後置節點,圖中是乙個4層的跳躍表 第0層 head 3 6 7 9 12 17 19 21 25 26 tail 第1層 head 6 9 17 25 tail 第2層 head 6 25 tail 第3層 head 6 tail 傳統意義的...

Redis 原始碼學習之 Redis 事務Nosql

redis事務提供了一種將多個命令請求打包,然後一次性 按照順序地執行多個命令的機制,並且在事務執行的期間,伺服器不會中斷事務而去執行其他不在事務中的命令請求,它會把事務中所有的命令都執行完畢才會去執行其他的命令。howredis中提供了multi discard exec watch unwatc...