#巨集的用法
#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...