本人是菜鳥一枚,在網路上多位技術大牛的指導下,尤其是讀了黃建健巨集老師的《redis設計與實現》和黃老師注釋的redis原始碼,對redis有了一些理解,在此深表感謝。當然更應感謝redis開源專案的作者。
言歸正傳,在此介紹自己的乙份收穫。在redis的sds.h和sds.c檔案下,有sdshdr結構體的定義和相關的函式實現,使sdshdr成為一種具備多種優良特性的符串型資料結構,相關原始碼如下:
struct sdshdr ;
//建立乙個由init和initlen初始化的sdshdr型變數
sds sdsnewlen(const void *init, size_t initlen) else
// 記憶體分配失敗,返回
if (sh == null) return null;
// 設定初始化長度
sh->len = initlen;
// 新 sds 不預留任何空間
sh->free = 0;
// 如果有指定初始化內容,將它們複製到 sdshdr 的 buf 中
// t = o(n)
if (initlen && init)
memcpy(sh->buf, init, initlen);
// 以 \0 結尾
sh->buf[initlen] = '\0';
// 返回 buf 部分,而不是整個 sdshdr
return (char*)sh->buf;
}從以上原始碼可以看出,sdshdr儲存字串的儲存區並不在結構體內,是在建立時根據實際需要申請的,實際儲存initlen個字元,為新建的sdshdr變數分配的儲存空間大小是(sizeof(struct sdshdr)+initlen+1)位元組,這樣剛好滿足要求。沒有浪費記憶體。在其他情況下,怎樣處理呢?請看下面的結構體:
typedef struct xrecord
record,*precord;
如果要採用類似建立sdshdr變數的方法為record變數動態分配儲存空間,應該分配多少空間呢?
precord createrecord(const double v0,const short v1,const char buff)
其中的extra_size應該怎樣確定呢?如果照搬sdshdr的分配方法,即:
extra_size=buff_size;
這樣,由於結構體內存圓整,在結構record內會有一部分填充空間(在32位環境下是2位元組)未被充分利用。為了充分利用這部分填充空間,需要確定
extra_size。也就是在利用record的填充空間的前提下,還需要多少儲存空間。
size_t extrasize(const size_t need_size)
完整的createrecord()函式實現如下:
precord createrecord(const double v0,const short v1,const char buff)
return pr;
C語言 結構體儲存空間分配
這兩天在看結構體,一直在琢磨結構體的儲存空間分配的問題,琢磨了半天總算明白了。和大家分享一下,希望能有所幫助。相信大家都知道結構體裡元素儲存要對齊吧,話雖是沒錯,只是這個 對齊 裡面包含了很多微妙的東西。首先詳細的給出結構體內存儲存空間分配的原則吧 編譯器按照成員列表順序乙個接乙個地給每個成員分配記...
C C 結構體的儲存分配
結構體的大小怎麼計算,在乙個整型佔4個位元組,字元型佔1個位元組的機器裡,乙個包含乙個整型 兩個字元型的結構體型別佔的空間有多大?4 2 1 6?看看下面這段 你知道它的列印結果 整型4個位元組,字元1個位元組 結果會是6 6 6 8嗎?讓我們來看一下結果吧 你對了多少個?第乙個和第四個相信不會有人...
關於結構體的儲存分配
先看乙個例子 struct my t struct my t2 int tmain int argc,tchar argv 結果為 1245020 1245021 1245016 1244996 1245004 1245000 1244980 1244981 1244984812 83個結構體中的成...