C-C++
文章平均质量分 84
ZeeCoder
这个作者很懒,什么都没留下…
展开
-
C/C++的mem函数和strcpy函数的区别和应用
mem系列函数是面试的时候常考的知识点,我们需要熟练掌握这三个函数的原理和代码实现,要能准确无误的写出代码。memcpy、memset和memset三个函数在使用过程中,均需包含以下头文件://在C中#include <string.h>//在C++中#include <cstring>memcpymemcpy函数是C/C++中的内存拷贝函数,它的功能是从源src所指的内存地址的起始位置开始,原创 2016-08-23 14:16:14 · 661 阅读 · 0 评论 -
Redis源码剖析--快速列表quicklist
在RedisObject这一篇博客中,有介绍到list结构的底层编码类型有OBJ_ENCODING_QUICKLIST,当时就发现这个底层数据结构被我遗漏了。昨天花了点时间补了补这个知识,看完发现这货就跟STL中的deque的思想一样,顿时觉得又是一个实现超级繁琐但很实用的数据结构。今天就带大家一起来看看这个“二合一”的数据结构。 quicklist是Redis在3.2版本加入的新数据结构,其是原创 2016-12-20 22:42:23 · 4675 阅读 · 1 评论 -
Redis源码剖析--字符串t_string
前面一直在分析Redis的底层数据结构,Redis利用这些底层结构设计了它面向用户可见的五种数据结构,字符串、哈希,链表,集合和有序集合,然后用redisObject对这五种结构进行了封装。从这篇博客开始,带你一点点分析五种数据类型常见命令对应的源码实现,慢慢地解开Redis的面纱。字符串概述字符串是Redis中最为常见的数据存储类型,其底层实现是简单动态字符串sds,因此,该字符串类型是二进制安全原创 2016-12-20 22:41:47 · 1528 阅读 · 0 评论 -
Redis源码剖析--对象object
前面一系列的博客分析了Redis的基本数据结构,有动态字符串sds、双端链表sdlist、字典dict、跳跃表skiplist、整数集合intset和压缩列表ziplist等,这些数据结构对于用户来说是不可见的。Redis在这些数据结构的基础上构建了对用户可见的五种类型,分别是string、hash、list、set和zset,为了更方便的使用这五种数据类型,Redis定义了RedisObject结原创 2016-12-15 16:32:46 · 2708 阅读 · 0 评论 -
Redis源码剖析--整数集合Intset
本系列博客文章已经分析了Redis的大部分数据结构,包括动态字符串,双端链表,字典,跳跃表等,这些数据结构都非常强大实用,但是在内存消耗方面也非常“巨大”。Redis的数据都是存放在内存上面的,所以对内存的使用要求及其苛刻,Redis会想方设法的来节省内存。假设有一组集合1,2,3,6,5\\{1,2,3,6,5\\},如果采用上述的数据结构来存储的话,必然会付出昂贵的内存代价,因此,Redis在这原创 2016-12-09 20:10:41 · 1232 阅读 · 0 评论 -
Redis源码剖析--基数统计hyperloglog
Redis中hyperloglog是用来做基数统计的,其优点是:在输入元素的数量或者体积非常非常大的时候,计算基数所需的空间总是固定的,并且是很小的。在Redis里面,每个Hyperloglog键只需要12Kb的大小就能计算接近2^64个不同元素的基数,但是hyperloglog只会根据输入元素来计算基数,而不会存储元素本身,所以不能像集合那样返回各个元素本身。基数统计什么是基数呢?基数是指一个集合原创 2016-12-09 20:10:18 · 3896 阅读 · 1 评论 -
Redis源码剖析--跳跃表zskiplist
跳跃表是一种有序的数据结构,它通过在每个节点中维持多个指向其他节点的指针,从而达到快速访问的目的。跳跃表在插入、删除和查找操作上的平均复杂度为O(logN),最坏为O(N),可以和红黑树相媲美,但是在实现起来,比红黑树简单很多。> 说起跳跃表,在前段时间面试中可帮了我的大忙。腾讯一面的时候面试官要求设计一个数据结构,里面的元素要求按一定顺序存放,能以最低的复杂度获取每个元素的名次,且增、删等操作的复原创 2016-12-09 20:09:55 · 1195 阅读 · 0 评论 -
Redis源码剖析--字典dict
字典是Redis中的一个非常重要的底层数据结构,其应用相当广泛。Redis的数据库就是使用字典作为底层实现的,对数据库的增、删、查、改都是建立在对字典的操作上。此外,字典还是Redis中哈希键的底层实现,当一个哈希键包含的键值对比较多,或者键值对中的元素都是比较长的字符串时,Redis就会使用字典作为哈希键的底层实现。Redis中的字典采用哈希表作为底层实现,在Redis源码文件中,字典的实现代码在原创 2016-12-09 20:09:26 · 1123 阅读 · 0 评论 -
Redis源码剖析--双端链表Sdlist
请持续关注我的个人博客:https://zcheng.ren今天来分析Redis的一个基本数据结构–双端链表,其定义和实现主要在sdlist.h和sdlist.c文件中。其主要用在实现列表键、事务模块保存输入命令和服务器模块,订阅模块保存多个客户端等。 # sdlist的数据结构Redis为双端链表的每一个节点定义了如下的结构体。// 链表节点定义typedef struct listNo原创 2016-12-09 17:23:02 · 1041 阅读 · 0 评论 -
Redis源码剖析--动态字符串SDS
请持续关注我的个人博客:https://zcheng.renRedis没有使用C语言的字符串结构,而是自己设计了一个简单的动态字符串结构sds。它的特点是:可动态扩展内存、二进制安全和与传统的C语言字符串类型兼容。下面就从源码的角度来分析一下Redis中sds的实现。(sds的源码实现主要在sds.c和sds.h两个文件中)# sds数据结构定义在sds.h文件中,我们可以找到sds的数据结构定原创 2016-12-09 17:19:50 · 2168 阅读 · 0 评论 -
Redis源码剖析--内存分配
请持续关注我的个人博客:https://zcheng.ren深受侯捷老师的《STL源码剖析》一书的影响,在该书中开篇就对STL的空间配置器进行了一个详尽的介绍。以应用的角度而言,空间配置器是最不需要介绍的,它总是隐藏在一切组件的背后;可是,就源码分析而言,空间配置是最为关键的,也是分析源码之路的第一步!Redis在内存分配方面,仅仅是对系统的malloc/free做了一层简单的封装,然后加上了异常原创 2016-12-09 17:18:28 · 2113 阅读 · 1 评论 -
Redis源码剖析--源码结构解析
找工作那会儿,看了黄建宏老师的《Redis设计与实现》,对redis的部分实现有了一个简明的认识。在面试过程中,redis确实成为了面试官考核我的一个亮点,恰好以后的工作又与redis有着千丝万缕的联系,于是就想趁着毕业前的这段时间把redis的源代码研究一下,为以后的工作打个良好的基础。 Redis简介redis全称REmote DIctionary Server,是一个由Salvatore S原创 2016-12-09 17:11:54 · 1812 阅读 · 0 评论 -
带你深入理解STL之Stack和Queue
上一篇博客,带你深入理解STL之Deque容器中详细介绍了deque容器的源码实现方式。结合前面介绍的两个容器vector和list,在使用的过程中,我们确实要知道在什么情况下需要选择恰当的容器来满足需求和提升效率。一般选择的准则有如下几条:如果需要随机访问一个容器,vector比list要好如果需要经常插入和删除操作的话,list比vector要好如果既要随机存取,又要关心两端数据的插入和删原创 2016-08-26 21:51:19 · 4599 阅读 · 1 评论 -
带你深入理解STL之Deque容器
在介绍STL的deque的容器之前,我们先来总结一下vector和list的优缺点。vector在内存中是分配一段连续的内存空间进行存储,其迭代器采用原生指针即可,因此其支持随机访问和存储,支持下标操作符,节省空间。但是其在分配的内存不够的情况下,需要对容器整体进行重新分配、拷贝和释放等操作,而且在vector中间插入或删除元素效率很低。而list是以节点形式来存放数据,使用的是非连续的内存空间来存原创 2016-08-26 11:43:24 · 15153 阅读 · 6 评论 -
带你深入理解STL之Set和Map
在上一篇博客中,讲到了STL中关于红黑树的实现,理解起来比较复杂,正所谓前人种树,后人乘凉,RBTree把树都种好了,接下来就该set和map这类关联式容器来“乘凉”了。STL的set和map都是基于红黑树实现的,和stack和queue都是基于deque一样,它们仅仅是调用了RBTree提供的接口函数,然后进行外层封装即可。本篇博客理解起来比较轻松,set和map的源代码也不多,大家可以慢慢“品味原创 2016-09-09 15:28:47 · 11458 阅读 · 2 评论 -
带你深入理解STL之List容器
上一篇博客中介绍的vector和数组类似,它拥有一段连续的内存空间,并且起始地址不变,很好的支持了随机存取,但由于是连续空间,所以在中间进行插入、删除等操作时都造成了内存块的拷贝和移动,另外在内存空间不足时还需要重新申请一块大内存来进行内存的拷贝。为了克服这些缺陷,STL定义了另一种容器List,它对于数据插入和删除的时间复杂度均为O(1),而且再内存方面不用频繁的拷贝转移。下面,就一起来看看Lis原创 2016-08-24 17:29:27 · 5509 阅读 · 1 评论 -
带你深入理解STL之Vector容器
C++内置了数组的类型,在使用数组的时候,必须指定数组的长度,一旦配置了就不能改变了,通常我们的做法是:尽量配置一个大的空间,以免不够用,这样做的缺点是比较浪费空间,预估空间不当会引起很多不便。STL实现了一个Vector容器,该容器就是来改善数组的缺点。vector是一个动态空间,随着元素的加入,它的内部机制会自行扩充以容纳新元素。因此,vector的运用对于内存的合理利用与运用的灵活性有很大的帮原创 2016-08-23 17:51:55 · 4134 阅读 · 2 评论 -
GDB调试工具入门
从windows转到linux下已经有一段时间了,每次刷算法题碰到问题需要调试的时候,就分分钟想关机,切换到windows上调试。于是,花了一点时间来搜索一下linux下常见的调试工具,这不搜不知道,一搜吓一跳,居然差点错过了这么好的调试利器GDB。上手十分简单,几分钟就可以开开心心调试你的代码了。GDB概述GDB是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大原创 2016-08-23 14:16:57 · 982 阅读 · 0 评论 -
Redis源码剖析--列表list
上一篇博客Redis源码剖析–快速列表 带大家一起剖析了quicklist这个底层数据结构的实现原理。Redis对外开放的列表list结构就是采用quicklist作为底层实现(在新版本的Redis源码中,不再采用ziplist和sdlist两种结构,而是统一采用quicklist)。有关列表键的实现源码在t_list.c文件中,大家可以边看源码边看这篇博客,一起来理解。List概述其实在[Redi原创 2016-12-20 22:42:58 · 1553 阅读 · 0 评论