在c語言中,乙個結構體中最後乙個成員的位址減去第乙個成員的位址,就是該結構體的大小
例如:
struct sdshdr ;
buf的位址減去len的位址,正好等於sizeof(sdshdr);
在c++中 char * str = "nihao"是不被允許的,但是c語言中可以,並且可以直接列印str 輸出nihao,和c++中 char str = 」nihao「;一樣的效果,自動在末尾加上了'\0'
將字串的首字元變成'\0',可以惰性的清空該字串。輸出該字串的時候,是空字串,但實際上這一塊記憶體並沒有被清理。
sh = zmalloc(sizeof(struct sdshdr)+initlen+1);
類似這樣申請記憶體的做法,由於char buf是結構體最後乙個元素,+initlen+1,相當給buf申請了乙個長度為initlen的空間,末尾的+1是存放'\0'的
2.空間預分配
記憶體重分配涉及複雜的演算法,並且可能需要執行系統呼叫,所以它通常是乙個比較耗時的操作。
sds進行空間擴充套件的適合,程式不僅會為sds分配修改所必須要的空間,還會為sds分配額外的未使用的空間。其中,額外分配的未使用空間數量由以下公式決定:
如果對sds進行修改知乎,sds的長度小於1mb,那麼程式分配和len屬性同樣大小的未使用空間,這時sds的len屬性的值將和free屬性的值相同。
如果對sds進行修改知乎,sds的長度大於1mb,那麼程式會分配1mb的未使用空間,例如進行修改後,sds的len變成30mb,那麼程式會分配1mb的未使用空間(free)
3.二進位制安全
sds使用len來記錄字串的長度可以避免傳統c字串以空白字元結尾造成的不安全。
redis簡單動態字串
redis內部使用sds,簡單動態字串,sds是什麼 dynamic t包含字串長度,空間使用率,已使用,未使用等資訊的乙個結構體 sds比c語言字串的優點 獲取字串長度不需要進行遍歷,時間複雜度為o 1 杜絕緩衝區溢位 對sds進行修改的時候,api會先檢查sds的空間是否足夠,如果不需要的話,a...
redis 簡單動態字串
redis沒有直接使用c語言傳統的字串表示,而是自己構建了一種名為簡單動態字串 sds 的抽象型別,並將其作為redis的預設字串表示,即redis中包含字串值的鍵值對在底層都是由sds實現的。每個sds.h sdshdr結構表示乙個sds的值,如下所示 sds遵循c字串以空字元結尾的管理,儲存空字...
Redis之簡單動態字串
sds的介紹 redis中字串並沒有使用c語言傳統的字串,而是構建了一種名為簡單動態字串 sds sds是redis的預設字串標識。redis裡面的c語言字串用在一些無需對字串值進行修改的地方,例如列印日誌redislog redis warning,redis is now ready to ex...