美文网首页
2019-07-18

2019-07-18

作者: 多血 | 来源:发表于2019-07-18 22:09 被阅读0次

1.在结构体中定义结构体

typedef struct zskiplistNode {
    sds ele;
    double score;
    struct zskiplistNode *backward;
    struct zskiplistLevel {
        struct zskiplistNode *forward;
        unsigned long span;
    } level[];
} zskiplistNode
/* Create a skiplist node with the specified number of levels.
 * The SDS string 'ele' is referenced by the node after the call. */
zskiplistNode *zslCreateNode(int level, double score, sds ele) {
    zskiplistNode *zn =
        zmalloc(sizeof(*zn)+level*sizeof(struct zskiplistLevel));
    zn->score = score;
    zn->ele = ele;
    return zn;
}

2.表示函数没有参数的正确方式
用void foo(void); 而不是 void foo();
https://stackoverflow.com/questions/693788/is-it-better-to-use-c-void-arguments-void-foovoid-or-not-void-foo
3.realloc
realloc是从堆上分配内存的.当扩大一块内存空间时,realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节,如果能够满足,自然天下太平;如果数据后面的字节不够,问题就出来了,那么就使用堆上第一个有足够大小的自由块,现存的数据然后就被拷贝至新的位置,而老块则放回到堆上.这句话传递的一个重要的信息就是数据可能被移动.
jianshu.com/p/718f68a092b0

#include <stdio.h>  
#include <stdlib.h>  
int main(int argc, char* argv[])   
{   
    char *p,*q,*x;  
    p = (char *)malloc(10);  
    q = p;  
    p = (char *)realloc(p,50);  
    x = (char *)realloc(p,100000);  
    printf("p=0x%x/n",p);  
    printf("q=0x%x/n",q);  
    printf("x=0x%x/n",x);  
    return 0;   
} 

输出:p=0x29c02790/nq=0x29c02790/nx=0x2a001000/
4.memmove
C 库函数 void *memmove(void *str1, const void *str2, size_t n) 从 str2 复制 n 个字符到 str1,但是在重叠内存块这方面,memmove() 是比 memcpy() 更安全的方法。如果目标区域和源区域有重叠的话,memmove() 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中,复制后源区域的内容会被更改。如果目标区域与源区域没有重叠,则和 memcpy() 函数功能相同。
runoob.com/cprogramming/c-function-memmove.html
5.redis大小端转换
redis 的所有存储方式都是小端存储,在endianconv.h中有一段大小端的宏定义,如果当前cpu的字节序为大端就进行相应的转换

#if (BYTE_ORDER == LITTLE_ENDIAN)
#define memrev16ifbe(p)
#define memrev32ifbe(p)
#define memrev64ifbe(p)
#define intrev16ifbe(v) (v)
#define intrev32ifbe(v) (v)
#define intrev64ifbe(v) (v)
#else
#define memrev16ifbe(p) memrev16(p)
#define memrev32ifbe(p) memrev32(p)
#define memrev64ifbe(p) memrev64(p)
#define intrev16ifbe(v) intrev16(v)
#define intrev32ifbe(v) intrev32(v)
#define intrev64ifbe(v) intrev64(v)
#endif

http://czrzchao.com/redisSourceIntset

相关文章

网友评论

      本文标题:2019-07-18

      本文链接:https://www.haomeiwen.com/subject/iaarlctx.html