C/C++
文章平均质量分 83
繁华落尽梦一场
暮春者,春服既成,冠者五六人,童子六七人,浴乎沂,风乎舞雩,咏而归
展开
-
redis源码分析——6、跳表skiplist的实现
skiplist是很有用的一种数据结构,在面试中也常见,效率上基本和红黑树等价,而编码实现又比红黑树简单很多1. 怎么样自己实现一个dict 不像C++、java等高级语言内置了map,C语言并没有提供dict库,所以如果想使用dict就需要自己实现。那么实现一个dict有方法呢?数组法这也是最容易实现的一种方法,简单说就是开辟一个长度为N的大数组(通常N是一个质数),然后通过一个哈希函数计算key的哈希值d,然后用d%N得到key对于的数组下边。设想一下,如果数组开的足够大,而且哈希函数.原创 2021-10-28 00:06:16 · 267 阅读 · 0 评论 -
redis源码分析——5、dict实现
dics是一种常用的数据结构,而C语言没有提供内置类型,本文一起看看redis中dict的实现1. 怎么样自己实现一个dict 不像C++、java等高级语言内置了map,C语言并没有提供dict库,所以如果想使用dict就需要自己实现。那么实现一个dict有方法呢?数组法这也是最容易实现的一种方法,简单说就是开辟一个长度为N的大数组(通常N是一个质数),然后通过一个哈希函数计算key的哈希值d,然后用d%N得到key对于的数组下边。设想一下,如果数组开的足够大,而且哈希函数足够散列,我们.原创 2021-10-28 00:04:57 · 248 阅读 · 0 评论 -
redis源码分析——3、简单动态字符串
redis对C语言的原生char*做了封装,关于string只讨论两个问题:1、redis支持的最长string是多少?2、string的扩容策略一、相关定义sds的定义typedef char *sds;sdshdr的定义/* Note: sdshdr5 is never used, we just access the flags byte directly. * However is here to document the layout of type 5 SDS stri.原创 2021-10-28 00:02:10 · 118 阅读 · 0 评论 -
redis源码分析——2、读写应答
了解了redis网络框架后,我们具体看看请求->回复的过程到底是怎么样的一、读回调客户端的消息处理循环有上一节可知,redis通过epoll来检测是否有客户端接入,一旦有请求,则会调用acceptTcpHandler,然后再调用createClient将fd和client对应起来,最后挂在到全局的server.clients链表上面。在createClient里面又调用了connSetReadHandler**(conn, readQueryFromClient)来将client加入到e.原创 2021-10-27 23:58:21 · 240 阅读 · 0 评论 -
redis源码分析——1、网络框架
一、 核心数据结构ConnectionType, ConnectionType定义了网络连接的接口,包含read、write等,具体定义如下。typedef struct ConnectionType { void (*ae_handler)(struct aeEventLoop *el, int fd, void *clientData, int mask); int (*connect)(struct connection *conn, const char *addr, int原创 2021-10-27 23:55:11 · 268 阅读 · 0 评论 -
数据库事务中MVCC的实现
原文链接 数据库事务中MVCC的实现MVCC(Multi-Version Concurrency Control),实现了读事务不加锁。MVCC对每行数据维护多个版本,无论事务执行时间有多长,MVCC总是能够提供与事务开始时刻一致的数据以InnoDB实现为例,InnoDB对每张表增加了两个隐藏列,其中一列存储行被修改的“时间”,另一列存储行被删除的“时间”。当然了,InnoDB存储的不是时间,而是与时间对应的数据库系统的版本号,当开启一个事务时,InnoDB都会给这个事务分配一个递增的版本号,这个版本号原创 2020-10-01 11:47:17 · 200 阅读 · 0 评论 -
redis源码之一步一步解析客户端连接请求
redis是一个性能很高的内存数据库,那么从我们使用客户端连接到执行一个命令,在redis中是如何执行的?接下来我们从源码角度调试查看内部流程。由于redis 6对网络IO使用了多线程,我们暂时先用redis 5来调试。服务启动redis作为后台服务,首先自己先要运行起来,然后等待客户端的连接。我们知道,redis网络模型是常见的Reactor模式,简单来说就是主函数复杂接收包,对于处理请求通过回调函数(CallBack)处理。通常情况下,我们会把回调函数放在单独我work线程里面。我们从main函转载 2020-10-01 11:45:05 · 699 阅读 · 0 评论 -
leetcode-212. Word Search II
/*Given a 2D board and a list of words from the dictionary, find all words in the board.Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those ho...原创 2020-01-16 23:30:00 · 187 阅读 · 0 评论 -
leetcode 二叉树先、中、后序遍历,非递归法
1. 先序遍历vector<int> preorderTraversal(TreeNode* root){ vector<int> result; stack<TreeNode *> st; TreeNode *p = root; while (!st.empty() || p != nullptr) { ...原创 2020-01-10 23:15:36 · 176 阅读 · 0 评论 -
Linux共享内存
[cpp] view plaincopy#include #include #include #include #include #include #define BUFFER_SIZE 4 int main() { int shmid = shmget((key_t)1234原创 2015-12-18 12:04:30 · 378 阅读 · 0 评论 -
C++中七大排序算法
这里的七大指的是快速排序、堆排序、归并排序、希尔排序、选择排序、插入排序和冒泡排序,由于桶排序应用场景有限,这里就不写了。先对比一下这几种排序的效率:观察表发现一个有趣的现象:对于堆排序和归并排序,他们的最好、最坏和平均的时间复杂度都是O(nlogn),也就是说数据的初始化顺序对这两种算法是没有影响的。先来一个直观的比较(500000条数据)直观来看,快速排序、堆排序和归并排序的时...原创 2015-12-18 12:06:22 · 1072 阅读 · 0 评论 -
winpcap实现从TCP三次握手到发送http请求
之前的文章我都是贴出了协议的格式,对具体字段没有具体说明,今天在这里补充一下。[cpp] view plaincopy/* IP报文格式 0 8 16 32 +------------+------------+-------------------------+ |...原创 2015-12-05 15:49:11 · 849 阅读 · 0 评论 -
基于winpcap和syn的dos攻击,亲测
网上这样的帖子很多,但有几个问题一直没解决。1、在计算TCP报头的校验和时应该还有伪报头,很多人都没有。2、在封装以太网数据包时需要用到目的地址的mac地址,由于很多人是在虚拟机上测,目的mac也就知道,但事实上,对于真正的远端主机来说,我们只能获取它的IP地址,而mac地址是无法获取的。而事实上,这儿的目标mac应该写的是网关mac地址。下面看我一步一步写syn攻原创 2015-12-05 15:44:58 · 961 阅读 · 0 评论 -
自己动手用ICMP写ping程序
ICMP是(Internet Control Message Protocol)Internet控制报文协议,它传数据,但是对数据有监督功能,比如你的数据没到达,则会返回一个icmp报文。icmp最常见的应用就是ping程序,可以探测两个主机之间是否连通。ICMP是网络层协议,但它又和IP一起发送(由IP承载)。[cpp] view plaincopy原创 2015-12-05 15:47:24 · 6206 阅读 · 0 评论 -
cgi中的环境变量
cgi中参数都是通过环境变量传递的,那么有哪些环境变量呢?直接上代码吧。#include #include int main(){ char *env_var[] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_A原创 2015-12-05 23:46:19 · 958 阅读 · 0 评论 -
const int a = 10; int *p = (int *)&a; *p = 100; a的值到底有没有改变
[cpp] view plaincopyconst int a = 10; int *p = (int *)&a; *p = 100; 很多人面试的时候都会被问这段代码最后a和*p分别是多少。答案不过三种:要么程序报错,要么a=10,*p=100,要么a=100,*p=100;其实这个地方是分const变量是全局还是局部的情况,先看局部情况原创 2016-02-01 10:37:37 · 2162 阅读 · 0 评论 -
堆排序解析
首先要了解堆的性质,我这里简答总结一下(这里说的是小堆):1、堆是一棵完全二叉树2、对于大堆中的任何一个非叶子节点,节点的值必须小于左右孩子节点值。由此可知,对于小堆而言,根节点就是最小值了,那么我们每次拿走根节点,拿走的顺序就是递增序列的。排序的元素在数组中,而堆也是一棵完全二叉树,所以直接用数组表示二叉树。对于完全二叉树中的K节点,其满足一下性质:1、K节点的父节点原创 2016-02-01 10:39:33 · 363 阅读 · 0 评论 -
UDP调用connect
大家都知道,在建立TCP连接时需要connect,但UDP调用connect又是什么情况。 在普通的UDP中,我们都是用sendto和recvfrom来收发消息的,这两个函数都有一个sockaddr_in参数,参数里面存放的就是目的端的ip和端口,而TCP的send和recv就不需要这些参数,为什么呢?稍微一想我们就知道,TCP在发送数据的时候已经建立了连接,所以不需要目的端的ip和原创 2016-02-01 10:40:27 · 638 阅读 · 0 评论 -
C++实现反射机制
话不多说,先上段代码的运行结果:class TestA:public Object{ DECLARE_CLASS()public: TestA() {std::cout << "TestA constructor" << std::endl;} ~TestA(){std::cout << "TestA destructor" << std::endl;}};IMPLEMENT_原创 2016-11-29 18:17:49 · 2976 阅读 · 0 评论 -
dll中接口中使用std::string和std::vector
最近在windows下封装dll给客户,接口参数类型都是std::string,直接在release模式下生成,客户也没什么反馈。但是自己线下在debug模型下测试的时候参数始终传递不过去,调试觉得内存很诡异。结果就是:STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下面是详细解释。...原创 2018-08-09 19:26:17 · 2192 阅读 · 0 评论 -
64位murmurhash 源码
提供了x86和新x64两个平台上生成64位MurmurHash的算法#ifndef MURMURHASH_H_INCLUDED#define MURMURHASH_H_INCLUDED// 64-bit hash for 64-bit platformsuint64_t MurmurHash64A (const void * key, int len, unsigned int se...原创 2019-03-24 00:59:05 · 2012 阅读 · 0 评论 -
C++11 右值引用与g++ fno-elide-constructors编译选项
右值和将亡值 C++11增加了一种新类型,称为右值引用(R-value-reference),标记为T &&。那么怎么区分左右值?左值指的是表达式结束后依然存在的持久对象,右值指的是表达式结束时就不再存在的临时对象。一个区分左值与右值的便捷方法是:看能不能对表达式取地址,如果能,则为左值,否则为右值。所有的具名变量或者对象都是左值,而右值不具名。 ...原创 2019-04-07 23:13:47 · 817 阅读 · 1 评论 -
leetcode 46. Permutations
Given a collection ofdistinctintegers, return all possible permutations.Example:Input: [1,2,3]Output:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]用递归class Solution...原创 2019-08-25 00:20:51 · 124 阅读 · 0 评论 -
Leetcode 100. Same Tree
Given two binary trees, write a function to check if they are the same or not.Two binary trees are considered the same if they are structurally identical and the nodes have the same value.Example ...原创 2019-08-25 16:22:32 · 176 阅读 · 0 评论 -
linux下安装boost
1、http://www.boost.org/下载最新版本并上传到后台,我下载的是boost_1_59_0.tar.gz2、解压 tar zxvf boost_1_59_0.tar.gz3、进入目录执行./bootstrap.sh,完成后生成一些文件,其中包含bjam4、执行./bjam对待完成5、测试#include #include int main(){ u原创 2015-12-14 17:50:03 · 470 阅读 · 0 评论 -
stl智能指针和boost智能指针对比
先说说stl中的智能指针auto_ptr,先说说auto_ptr的特点。std::auto_ptr用来管理单个堆内存对象,但是独享所有权,且不允许赋值和拷贝(没有重载operator=),所以如果在函数内部需要指针时,auto_ptr是一个不错的选择,但需要注意的是它不容许复制,这也就是容器(vector,list等)中的元素类型不能是auto_ptr。一般的用法是std::auto_ptr原创 2015-12-14 20:15:01 · 3229 阅读 · 0 评论 -
accept与connect的超时设置
connect超时:我们都知道,connect对应与三次握手中的第一次发送SYN,而对待服务器的ACK,如果服务器没有启动服务器,有些机器会立刻返回一个RST表示服务器拒绝,从而connect失败,但又些服务器为了防止攻击,什么也不发送,直至客户端connect超时,而这一时间又75s,对于客户端来说是不能接收的。所以需要设置connect的超时时间。利用select设置connect的超原创 2015-12-11 22:46:28 · 14331 阅读 · 3 评论 -
和链表有关面试题
面试中被问链表的题目我就不再多说,直接总结题目。1、将链表逆序这个问题很早就研究过,但后来一次面试的时候我突然紧张忘了,没答上来。我不知道大家的解法是什么,我的解法是遍历链表是用前插发插入节点,最后的链表就是逆序的。[python] view plaincopyclass ListNode: def __init原创 2015-12-11 18:09:21 · 462 阅读 · 0 评论 -
字符串流与十六进制的转换
一般效率高的函数都要出输入是十六进制流,但是转换成十六进制后有些字符不可见,这对人来说不太好,所以需要转换。char get_dec_value(char ch){ if ( ch >= '0' && ch <= '9') return ch - '0'; else if (ch >= 'a' && ch <= 'z') return ch - 'a' + 10; else i原创 2015-11-08 12:42:23 · 731 阅读 · 0 评论 -
关于C语言多文件编写的一点小小总结
在多文件编写中,变量,尤其的全局变量的定义和引用显得不那么精简。很多人可能会想,把全局变量放在一个*.h文件中,然后在以后的调用中只要include一下不就可以了?想想也有道理,include不就是把*.h原封不动的复制过来吗?但是,这样存在一个问题。加入定义了10个全局变量,而在具体一个*.c文件中我只用其中一个。如果用include把全局变量全都包含进来。那利用率不就才是10%吗。而且C语言常原创 2015-11-14 12:24:00 · 522 阅读 · 0 评论