自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

fpcc的专栏

于细微处见精神,从宏观里学态度。行之苟有恒,久久自芬芳。

  • 博客(149)
  • 资源 (21)
  • 论坛 (48)
  • 问答 (1)
  • 收藏
  • 关注

原创 RUST的环境安装及更新

一、RUST语言RUST,这个语言出来时间可不短了,作为Mozilla推出的一门语言在小众领域里还是相当有名气的。今天就把这个语言的安装和开发环境的设置说明一下,带领大家进入RUST的开发世界。rust现在还处于发展期,存在三种版本:稳定版、测试版、每夜版。二、RUST基础环境安装在Windows平台和Linux平台,都需要安装c++环境,简单的方法是在Windows上安装VS,在Linux下安装GCC相关即可。1、安装方法打开网页:https://www.rust-lang.org/in

2021-01-10 12:13:33 32

原创 redis源码分析之十二数据持久化存储

一、数据持久化redis做为一种内存型数据库,做持久化,个人感觉略有鸡肋的意思。似乎有一种,别人有,自己不有也不行的感觉。以目前Redis主流的应用方式,如果仔细分析,基本上都是在内存中即可完成,对持久化没要求或者说不大。再举一个反例,如果内存中有几百G甚至更多的数据,真要是整体当机,恢复的时间基本就是灾难。目前基本应用仍然是以关系型数据库或者其它数据库(如Hadoop,Mysql等)为持久化的方式,Redis只是发挥其内存数据库的长处,诸如高速缓存、分布式锁、分布式海量数据的高并发等。但有胜于无吧,本

2021-01-02 15:18:29 100

原创 跟我学C++中级篇——STL的学习

一、c++标准库C++的标准库主要包含两大类,首先是包含C的标准库的,当然,为了适应c++对一些C库进行了少许的修改和增加。最重要的当然是面向对象的c++库;而c++库又可以分成两大类,即面向对象的c++库和标准模板库,也就是题目中的STL。另外在此基础上,还要提醒同学们的是,除了上面的库,在各个平台的开发厂商中,还会针对实际情况,对标准库进行扩展,这些可以归纳为扩展库。同时,随着c++标准的不断迭代,还推出了很多新的库,同学们需要不断的学习跟进,目前最新的c++标准为c++20。主流的c++标...

2021-01-01 16:55:30 85

原创 redis源码分析之十一内存管理

一、redis的内存管理一般来说,稍微有点规模的软件,都会自己搞一块内存管理,原因很简单,统一管理内存,适应自己的场景。其实按大牛们的话,这未必是最优选择,实在是小看了写库的那群大牛们。不过说归说,人家写也不会给你报备,想写自然就写了。Redis就听从了大牛的看法,使用了底层更好的内存分配库,根据情况使用tmalloc,jemalloc 以及glibc中的 malloc(pmalloc)。一般来说,内存管理不外乎这么几块:内存大小的管理,比如分不分页,一页多大为好。内存分配管理,怎么分配,多大...

2020-12-26 18:24:19 44

原创 跟我学C++中级篇——Windows下的静态库

一、Windows下的静态库其实静态库在Windows平台上还是好创建和使用的,由于VS这个IDE的存在,创建一个静态库是非常简单的了,在VS2019中和前面的版本略有不同,打开VS2019后,点击“创建新项目”,在右侧的窗口中有三个选项,最左侧为语言,选择“C++”,当中选择“Windows”,最后一个选择“库”,在下面选择需要的“静态库”。点击“下一步”,会出现“项目名称”,“位置”,“解决方案”几个设置选项,根据个人喜好创建即可。最后点击“创建”即可成功。运行这个空的程序即可生成一个默认的静态库。

2020-12-20 09:59:36 32

原创 redis源码分析之十集群之二GossIP

redis源码分析之十集群之一之二GossIP一、P2P通信传统的互联网设计,包括现在主流的互联网系统,基本是中心化的,也就是说,一切的网上活动,都需要经过一个服务中心(这是一个逻辑表述,不要和一个点,一个机器,一个机房等混淆),用户所有的动作,从理论上讲,都可以被服务端记录和控制。它和现实社会是对应的,比如去火车站买票,必须去火车站(虽然说现在不用亲自去火车站,但中心化反而更严重了)。买东西,必须去超市和菜市场,就是要打个电话,也得去电信公司办个卡。而这些,都是中心化的,只不过可能用户在办理的时候儿感

2020-12-20 09:39:49 104

原创 Linux下的库相关工具和命令

Linux下的库相关工具和命令一、相关工具集在Linux的实际开发中,与库相关的命令工具有很多,这些工具在前面也介绍了一部分,现在做一个相对全面的介绍,掌握了这些命令工具,会在实际开发中大大减少解决问题的思路,提高开发的效率。在查找和定位问题时,起到事半功倍的效果。二、查看和分析工具1、file这个命令可以用来查看几乎所有类型的文件的详细信息file[-bchikLnNprsvz][-fnamefile][-Fseparator][-mmagicfiles...

2020-12-12 19:07:42 97

原创 redis源码分析之十集群之一通信

一、集群再强大的系统也有当机的时候,可能是自身原因,也可能是外在原因。那么单机部署任何一个软件,都会有这种风险,而有的时候儿,这种风险是不可承受的或者说成本太高了。所以,支持分布式的部署几乎是所有大型软件的必备,Redis同样也支持,这就是集群模式。Redis的分布式集群模式不是一步而就的,一开始是简单的主从模式,一主N备,发现主设备挂掉,需要人工参与将Slaver提升到主;后来在2.8版本中,增加了哨兵模式,也就是简单化了主从的转化,但仍然没有解决主从模式中从节点下线的人工干预,也无法进行自动...

2020-12-05 15:19:24 48

原创 跟我学c++中级篇——Linux下的静态库之二

一、动态库和静态库动态库和静态库各自有自己的优势,动态库可以减小应用程序的体积,动态加载,特别是共享库还节省内存,静态库加载快执行速度也稍微快一些,但相对来说就是可执行文件的体积大,修改后需要重新编译。说回来还是空间时间效率等的平衡。对第三方开放的重要的库,动态库居多,一来升级方便,再提供一个新库即可;如果提供一个框架库,就需要静态库或者说又提供静态库同时提供动态库,比如常见的C和C++的库,都提供了静态库同时也提供了动态库。不过一般在编译时(没有强制指定),默认都是链接的动态库,如果没有链接到动态库

2020-11-29 11:51:54 14

原创 跟我学c++中级篇——Linux下的静态库之一

一、静态库动态库学习完成后,要学习静态库了。其实,静态库的出现要比动态库要早,毕竟静态库相对动态库来说,从重用的角度来看,可以最先被设计人员想到,早期的静态库,其实就是多个编译单元的简单组合,它完全可以像普通的拼插玩具一样直接拼插到别的软件中,而不需要这个依赖那个依赖。换句话说,静态库是一个完整的软件模块的描述和运行的集合。既然是完整的,就会有一个现象,那么静态库是可逆向的,或者说,静态库是一系列目标文件的集合的文件。静态库和动态库的区别在于:1、静态库是完整的模块,可执行文件直接加载即可使...

2020-11-21 09:38:16 20

原创 redis源码分析之九网络服务端

一、网络的整体架构在前面介绍Redis的整体流程时,初步介绍过服务端的网络代码,现在先看一下整体的架构:1、服务处理(EPoll)如果没有接触过网张编程的,特别是对LINUX上的编程模型一点都不清楚的。这块可能是个麻烦.Redis为了保证在不两同的平台的高效可行的运行,采用了在不同平台自适应使用不同的网络编程模型,这其中包括一些可能比较专用的平台,如Solaries10中的 evport,macos(FreeBSD)中的Kqueue模型。一般情况下,不论是类UNIX平台还是类LINUX平台,都...

2020-11-14 19:21:48 49

原创 跟我学c++中级篇——Linux下的动态库之四动态库的整体流程

一、动态库的编译在前面对库的基本知识和应用进行了初步的学习,同时对库文件如何分析有针对性的学习了几个命令。现在开始正式学习一下动态库的整体的生命周期过程中是如何运转的。首先当然是编译,编译器提供了对动态库编译的支持,目前主流的c++/c编译器就那么几种,gcc,cl(vs),clang,曾经也有过宝兰德的TC和BCC,还有一些大公司自有的如INTEL的ICC,另外就是嵌入式里有一些ARM的专用编译器。 目前基本学习c++主流的两大平台,基本就是以cl和gcc为主。大家也可以看到从开始到现在,基本就是在这.

2020-11-07 12:00:19 32

原创 redis源码分析之八基础的数据结构quicklist

一、quicklist再看一下quicklist,它是从Redis3.2才提供的一个数据结构。从字面意思上理解,这个应该比list快。但是同样是list,为什么它要快?就得找一下原因。在普通的list中,可以通过拥有的前向和后向指针进行前后的遍历和查找。但是,当数据量大时,这两个指针占用的空间就非常明显了。而在前面的ziplist中,可以看到,通过指示本Entry的长度配合相关标识,就可以去除这两个指针来进行遍历。但同样也要看到,这是有代价的,代价就是,在插入和删除时,空间的不断的动态变化导致的内存空间的

2020-10-25 10:46:44 11

原创 跟我学c++中级篇——初步的模板元编程

一、介绍一般人可能没怎么听说过元编程,但是大多搞程序的都听说过元数据,元数据是表示数据的数据,那么元编程(元程序)就可以推广过来,元编程(元程序)是表示程序的程序。用英语来表示“a program about program”。可能很多人对此表示很陌生,没有接触过它,确实是这样。因为他的应用场景一般在普通的编程领域很少遇到,即使遇到,也可能是当成一种特例来使用。其实,如果接触过编译器方面的知识,...

2020-10-23 14:28:54 18

原创 Socket并发配置之一config的配置

一、Socket并发的配置在Socket并发访问中,五元组(源IP,目的IP,协议号,源端口,目的端口)的存在,使得其的可变化比较大,但其中大多数应用的场景可以抽象到一个具体的机器中来,在这一个具体的机器的配置中,引申出未来集群和分布式的配置管理。在一个具体应用中,一般来说的是一个单机,IP是固定的,但是端口是可以动态扩展的(0~65536,但是其中有不少被默认占用了),也就是说,作为一个单机,只考虑简单的变化情况,那么只有IP和端口两个作为组合的条件。如果有写过实际程序的,可以发现在客户端,一般就是自动

2020-10-18 09:25:43 78 2

原创 C++20中的三路比较运算符

一、operator<=>三路比较运算符也是一个c++20新提供的一个功能,网上有的人叫“航天飞机运算符”也有的叫“宇宙飞船运算符”,知道啥意思就行。在以前的c++编程中,实现基本类型的比较功能是由标准语法直接提供的,但在实际的编程中,经常会遇到这样一些问题,封装好的对象(类和结构体对象)也会出现一些比较的要求,这时候儿,一般会通过重载某个运算符来实现特定的对象的比较。而在c++20中提供的这个三路比较运算符,会默认生成一系列的比较运算符,如果默认生成的语义不符合自己的标准,那么可以自定义其

2020-10-11 12:20:05 192

原创 redis源码分析之七基础的数据结构ziplist

一、ziplist压缩列表压缩列表是HASH和跳表的小数据时的数据结构,这个在前面提到过。压缩列表的定义和使用其实在源码的头部说明中是很清楚的。看一下英文的注释:The ziplist is a specially encoded dually linked list that is designed to be very memory efficient. It stores both strings and integer values, where integers are encoded as

2020-10-08 16:40:19 19

原创 redis源码分析之六基础的数据结构skiplist

一、skiplist 跳表跳表这个数据结构是新生的,在学习数据结构的时候儿是没有这个的。当然,也可以理解成是对数据结构的进一步的封装,这样理解的话,可能就会更准确一些。为什么叫跳表?想想生活中跳的动作,一般人走路是一步一步的走,而如果跳跃的话,一下子可以走好几步,但是付出的代价就是要多费些力气。其实跳表也是如此,正常的链表list,访问的时候儿是从头到尾(或者反过来)一条条的遍历,而跳表由于多了一些特殊的指针,可以一下子就访问距离自己更远的节点,并通过一些状态,来判定是否满足要求。如果满足就不再向前跳。

2020-10-07 22:17:10 37 2

原创 redis源码分析之五基础的数据结构字典

一、dict 字典在Redis中,字典就是HASH表。哈希表的优势在于查找速度快(理想状态下O(1)),但大小不好控制,大了浪费,小了冲突。而过多的冲突最终会使得哈希表退化。这就需要有一个处理机制,来达到容量和冲突解决的一个动态平衡。在Redis中,字典可以自动动态扩容,为了保证适应性和安全性,DICT不是一次完成扩容的,是渐进的,批次完成的。二、源码分析1、字典的定义://字典的节点定义typedef struct dictEntry { void * key;//这个好理解,KEY

2020-10-06 16:48:24 12

原创 redis源码分析之四基础的数据结构SDS

一、SDS在前面的初步介绍中,知道Redis中的字符串是SDS——simple dynamic string,可能对于非c++人员有点不好理解,其实如果看STL的代码中std::string的实现,可能就会发现,其实有些类似,而且SDS相对简单不少。SDS除了可以实现字符串,其实还可以用来做缓冲区,毕竟char*的定义本身在C/C++中都是天然做为缓冲区的。typedef char *sds;使用char*来操作字符串,但是底层存储采用二进制,这也是为什么Redis中二进制数据存储安全的原因,由于采

2020-10-03 18:56:59 26

原创 redis源码分析之三基础的数据结构

一、基础数据结构在整体上把握了Redis的架构流程后,先分析一下基础的数据结构。这样,一个是对以后各个模块分别分析时,不会因为对数据结构的陌生而增加源码分析的难度,又可以通过分析基础的数据结构来初步掌握redis的设计风格。在redis中,共有五种基础数据结构:string:字符串,在KV结构中,Key都是字符串类型。其它的数据结构可以说是从这个基础上衍生出来的。它可以存储字符,复杂的字符串(JSON,XML),数字,甚至可以是图片和音视频。其长度控制在512M内。list:列表,列表是用来存储多个有

2020-10-01 19:50:34 46

原创 跟我学c++中级篇之类的虚表分析

一、继承和多态首先说明的是,代码示例是在X64位中编译的。说起对象的布局,肯定不能离开大牛的代表著作《深度探索c++对象模型》,译者是侯捷先生,双剑齐出,不同凡响。那么c++的类和C中的结构体有什么不同呢?这里抛砖引玉,先看一个简单的例程:class Base{public: Base() {} ~Base() {}public: int SetBaseData(int data) { this->data_ = data; return this->data_;

2020-09-26 11:52:19 38

原创 C++20中的module

一、模块在非c/c++语言中,引入其它的类似库的文件,一般都是使用import某某包,像JAVA,GOLANG,PYTHON等,这样的优势在于,简单明了,不容易产生循环引用,即使产生后也容易发现和解决。回过头来再看c++和C中,对头文件的要求可是非常的严格,首先是顺序,比如先引用哪个再引用哪个;然后是对循环依赖的解决。可能有的人反对说不难啊。确实,中小型文件确实是比较好解决,工程稍微大一些,就会发现,经常会出现一些莫名其妙的事情,找来找去,发现最后竟然是头文件的问题。这也是c++饱受争议的地方,不过这在

2020-09-20 10:07:18 612

原创 跟我学c++中级篇——Linux下的动态库之一

一、LINUX下的动态库在前面将动态库的知识初步学习了一下,本篇将着重讲一下Linux下的动态库的编写和使用。在gccK和 g++中,都提供了丰富的编译选项,用来给程序员编译动态加提供较多的选择。可是,对于新手来说,如此多的编译选项反而会让其感觉到迷茫。所以还是那句话,先从简单的入手,不要上去就啃大部头,省得忙个昏天黑地反而打击了自己的积极性。Linux下的动态库以.so结尾,命名方式必须是以lib开头,中间填充自己想取得动态加的名字。比如你想生成一个叫order的排序库,那么最终编译时应该是lib+o

2020-09-19 16:02:16 25

原创 C++20中的协程

一、协程在谷歌的Golang中,如果大家说他的特点有啥,肯定绕不过协程。而在此之前,大多数的语言一般是从多进程讲到多线程,一般来说,对某个语言掌握的深度,就看在多线程下编程的能力(当然,没有多线程的除外)。多线程的编程难度自然是很多程序员望而却步的。虽然说多线程编程有他的优势,但能不能一种更好的方式,既可以有多线程的并行执行的优势,又能降低其开发的难度呢?于是在Go语言中出来的协程。协程可以理解为用户态的线程,大家都知道,多线程的调度是由内核来完成的。所以在多线程编程中,会涉及到相当多的状态保护和资源保

2020-09-13 06:05:07 779

原创 跟我学c++中级篇——动态库

一、基本概念和介绍在人们的实际生活中,经常会遇到这样一些工作,比如大街上的小商贩经常通过喊话来吸引人们的注意,但是这些话基本的内容都是一致的,如果日复一日,年复一年的不断的喊此类东西,累不用说,对喊话者来说,也是一种无意义的负担。那么怎么解决这个问题呢?小喇叭,带录音功能的小喇叭,有多少个地方就发多少录好音的小喇叭。就节省了好多的人力、物力。但是如果地方越来越多,而且播放的声音经常改呢?这又出来新的问题,于是,是不是可以用网络联通,各个小喇叭只是访问一下服务器,只在服务器上有一个播放的声音源就可以了呢?这

2020-09-06 09:14:37 153

原创 线程的局部存储

一、什么是线程的局部存储在前面提到多线程或者多进程编程中,都会提到一个资源共享的问题。现在可以知道通过使用各种锁来控制数据的共同访问资源的问题。但在实际情况中还会有一种场景,就是每个线程都有自己的相同的类似的资源,这样每个线程都可以控制自己的资源。就如好多孩子一起捡豆子,每人有一个盛豆子的容器一样,每个孩子把自己的豆子放到自己的容器中去,最后凭谁的多来判断胜负。线程局部存储的意思和上面的例子差不多,其实就是多个线程中的变量你是你的我是我的,咱们互不搭界,互不侵犯,最典型的就是VC中的Getlasterr

2020-08-30 10:54:05 52

原创 Linux下几种定时器的使用

一、定时器在项目的开发过程中,经常会遇到使用定时器的情况。定时器,顾名思意,就是定时定点工作的一种机制。定时器这个东西,无论是在军事、工业甚至是航天飞行的尖端科技上都是必不可缺的。在国人心中大长志气的北斗卫星,其核心也是有一个授时系统,你也可以简单理解成一个定时器(这不太准确,人家那个复杂的多)。Linux下,由于开源的问题,平台甚多,导致大量的类似或者相近的定时器函数,但其实常用的只有几种,其中有一些在man文档中已经明确指出不建议再使用,当然还有一些高手自己编写了自己的高精度定时器,但弄明白了下面的

2020-08-22 12:22:52 166

原创 c++中拷贝构造和赋值重载的分析

一、对象的等同操作在实际工程开发中,经常遇到类似于下面的问题:int a;a = 1;int b = 0;b = a;int c = a;举这么简单的例子可能大家觉得有点LOW,但是,假如把上面的原生类型改成类对象,会是什么现象呢?这也就引出了今天的问题。在类中有拷贝构造函数,有=赋值重载函数,那么这二者在什么情况下会调用呢?换成比较通俗的问题,如果想让两个对象保持一致,应该怎么做。也就是像上面简单例子中 b = a,c = a之类的操作。二、分析应该说这是一个相当基础的问题,但可能许

2020-08-15 16:52:00 82

原创 c++中虚析构函数的使用

c++中虚析构函数的使用一、为什么使用虚拟析构函数在c++中,为了实现里氏替换原则,父子类可以通过虚拟函数来实现特异化的不同,即常说的动态绑定机制。正常情况下,构造函数是无法声明成virtual的,但是一般来说,推荐析构函数默认为virtual。也就是说,析构函数使用虚拟函数是常态情况,不使用是非常态。那么,为什么析构函数要声明为virtual呢?c++是一种静态编译语言,也就是说,绝大多数情况下,在编译期,各编译单元就完成了编译的运作,在实际运行时,装载器只是装载链接相关地址即可。但是由于c++支持

2020-08-09 14:15:36 94

原创 跟我学c++中级篇——静态(全局)变量初始化依赖

一、问题的现象实际的项目代码中遇到一个很疑惑的问题,问题可以描述为:一个静态成员初始化的时候直接core掉,该静态成员初始化时通过另外一个文件中静态成员来完成。该问题同样发生在全局对象上。具体可以用代码简述如下://test1.cpp#include<string>std::stringa="test";//test2.cpp#include<iostream>externstd::stringa;std::stringb=a;int...

2020-08-02 08:47:48 189

原创 跟我学c++中级篇———pimpl

一、何方神圣——pimplPrivate Implementation,私有化实现。在c++中,由于语言本身的限制,没有纯粹的接口定义。这就导致了在接口的使用上很多c++的人员都是随心而动。有用抽象类的纯虚函数的,有直接用C类型的接口的。有干脆提供接口类的…不一而足吧。根据实际情况,实事求是的选择才是一个好的标准。在c++中,大量的头文件的安全包含,本身就是一个重要的问题,普通的重复定义这都是小问题。一些莫名的,甚至头文件的顺序都引起的“血案”也是经常发生的。正所谓,代码量大了,啥情况都遇得到。而使用P

2020-07-26 09:39:56 75

原创 算法和数据结构之快速排序

一、排序接着造火箭,面试对排序一般是不会放过的,而在所有的排序中,快排勿庸置疑是问的最多的。而在实际应用中,这个排序确实也是在实际工程中用的最多的之一。快速排序是什么呢?快速排序就是通过排序数据进行比较和交换位置来实现数据排序的目的。快速排序分为经典快速排序和随机快速排序。前者是指定固定的基准数据(最左或者最右即第一个或最后一个),随机快速排序是随机指定任一一个。快速排序的时间复杂度为O(nlogn),最坏情况下,即分治后一侧为1,另外一侧为n-1,时间复杂度为O(n^2),空间复杂度为O(nlogn)

2020-07-18 23:43:19 33

原创 使用智能指针的两次深坑

在完善别人的代码,苦逼进行中。然后,发现了一个问题。只是随手改了一下,把数据结构体的=赋值操作改成了拷贝动作 memmove,然后测试的就说,程序大概率会崩溃。仔细看了下,报下面的错误:“异常: 0xC0000005: 写入位置 0xxxxxxxxx 时发生访问冲突”.下断点跟进去,发现是在析构函数里释放赋值的那个指针操作时崩溃的。当时根本都没有怀疑到拷贝动作的改变。只是认为可能是没有初始化指针,造成了重复释放。或者说释放了一个野指针。查来查去,结果发现,还真没有,干活的小姑娘还是相当细心的

2020-07-18 22:31:11 143

原创 自定义智能指针的注意点

问题:是不是在XP上可用?1、==的判断,NULL要在前,否则报无法INT与THIS匹配2、注意点和->3、重载的注意点,类对象第一个函数可省略但其实是默认this,如果想做非本对象为第一位的,必须用友元的来操作。4、没有==则LIST无法用5、智能指针的Reset是-1,如果为0则释放,不要混了一定释放。6、如果自定义=(拷贝),则一定要清除自己。7、为什么STL的为直接赋0没问题,自己写的有问题。有一个小程序,用到了智能指针,挺好用的。但是业务需要,在XP上使.

2020-07-18 22:27:06 80

原创 C++小知识——语法糖和纯虚函数的注意点

语法糖,英文是syntactic sugar,原来一直没注意它的意思,只是固定的将它定义成了一个类似固定符号的东西,在《C++编程思想》,上面把运算符的重载这种语法糖,翻译成了“语法上的方便”,而在词典上一般译成“语法上的甜头”,顾名思义,这才真得明白为什么大老外把这类东西叫语法糖,包括在C++11中对Lambada表达式也称做是语法糖,在语法上给你个小好处,小甜头,让你吃着方便,品着顺心。原来这才是人家真正的意思。看几个语法糖的例子://lambda表达式,自动返回值和显示指定auto x = [](

2020-07-12 11:02:34 54

原创 算法和数据结构之树
原力计划

一、介绍面试造火箭,开始造树。那么什么是树(Tree)呢?马路边儿上的大树,森林里的大树?是的。就是那玩意。数据结构的树之所以叫树就是因为和马路边儿上的大树长得差不多。做为一种抽象的数据类型(ADT)——树,就是因为他的组织结构类似于树的形状(不过要倒过来看,也就是根在最上,树叶在下面),树是由有限个节点(Node)组成的。下面看一个普通的树的图:在自然世界中,两根树枝是不能连接生长在一起的,所以数据结构中的树也一样,不能在两个子树之间有直接的连接,否则,就不是树了。这个需要引起注意。二、树的形态

2020-06-13 17:08:05 75

原创 算法和数据结构之链表
原力计划

一、基础知识继续造火箭。什么是链表?顾名思义,链表就是链状的数据结构,可以想象成在日常生活中,一条铁链一环扣一环的链结在一起。每个环上存储了相关的数据。在数据结构中,组成链表的节点通常有两个以上的域,一个域用来存储数据,其它的域用来存储指向其它节点的方式(指针等)。这样通过每个节点的指向其它节点的方式形成一条数据链。链表可以有头节点,也可以没有头节点,但一定会有尾节点(C/C++中,指向NULL的指针)。链表分为单向链表、双向链表和循环链表三类。这里以单向链表为例,双向链表和循环链表类似,只是多了一些

2020-06-06 10:05:57 77

原创 Fabric源码分析之九数据库存储源码分析leveldb
原力计划

一、fabric数据存储在fabric中,数据的存储被抽象成一个帐本对象,本身数据底层的数据库和文件是被隔离的,这样做的优势在于,上层数据的变化,对底层数据库的影响极小,甚至于一般情况下都不会有什么影响。抽象的这一层包括有帐本数据存储对象(包括区块数据文件、隐私数据库和区块索引数据库)、状态数据库、历史数据库和Transient隐私数据库等。看一下它们的相关的类图:从上图可以清晰的看到整个Fabric中数据存储的相关的类关系。其具体的类代码如下:首先看一个最底层的DB操作类及其相关的类,其下就是操作

2020-05-10 19:23:59 530

原创 Fabric源码分析之八commiter(记帐)节点分析
原力计划

一、记帐节点区块链的一个特点是分布式记帐,即各个节点都要承载相同的一份数据。在联盟链中,因为一些节点的配置有所不同,所以可能有些节点没有记帐功能或者说不需要完整的帐本。因此本篇就针对具有记帐功能的相关源码进行分析。记帐其实就是数据存储的过程,根据实际情况写入或更新相关数据库。记帐的功能主要包括交易的验证和帐本提交两个主要的方面,具体到数据的存储和区块的具体的数据结构等会在后面专门相关的篇章进行...

2020-04-28 11:42:50 879

链接器的介绍

一个大学内部的PPT文档,讲LD链接器的工作原理的,不过它是面向嵌入式开发的。(嵌入式系统程序设计:ld 链接器 1.概述 2. 链接描述文件简介)

2018-11-17

linux设备驱动开发

本书从浅到深介绍了LINUX操作系统上的驱动开发的过程,值得推荐。

2018-11-17

masstree算法论文

目前的底层的分布式数据库如ROCKSDB等都使用的LSM的算法,本文使用了masstree这种算法来优化其处理。

2018-11-17

虹膜开源的算法

本文是国外的一款开源的虹膜识别框架的介绍,它的源码是可以直接使用的,但是需要优化。

2018-11-17

BTN的白皮书

BTN链是提供商业使用的软硬扩展的去中心化商业级应用(DAPP)开发平台。它的主要特点是去中心化计算和去中心化的存储。

2018-10-11

mixin白皮书

mixin是一个闪电交易快速的点点对的数字交道项目,它拥有非常好的技术栈。

2018-10-11

steamr白皮书

steamr是一个用来做数据去中心化的网络和市场相关的区块链项目,主要提供去中心化的云服务。

2018-10-11

阿希链白皮书

阿希链是一个用javascript写的侧链,主要用来完成多链间的通信,有一定的特色,可以借鉴。

2018-10-11

大数阶乘算法的一个例子

小数的阶乘比较好做,但是阶乘的数量变化非常快,很快会溢出,这里采用一种变通的方法,可以实现相当大的数的阶乘,如果在这个基础上进一步扩展,能进行更大的阶乘算法。

2018-10-06

Sql批量操作数据

在SQLSERVER的多条数据操作时,使用SQLBULKCOPY等几种方式的对比,这篇文档就是整理了这些使用的方法。

2018-10-05

电网闪变信号的小波分析

本文利用小波分析来对电网的闪变信号进行处理,有很高的借鉴价值。

2018-10-05

电能质量闪变的测量

电能质量是电力行业一个重要的部分,本论文从实际出发,论证了闪变测量的方法。

2018-10-05

安卓编译JAR包和SO

这个是用ECLIPSE编译JAR包和SO的一个教学录像,非常适合对c++不熟悉的人编译使用。

2018-10-01

JAVA并发编程设计原则与模式

一本比较老的书,讲得多线程和并发技术,是一个入门的比较浅显的书籍。

2018-10-01

代码管理核心技术及实践

代码管理是开发过程一个重要的环节,好的代码管理可以为团队的开发提供安全的保护和合作,本书就是讲述在不同环境中如何使用主流的代码管理软件和方式。

2018-09-30

IOTEX白皮书

物联网和区块链的结合,实现了链中链和跨链的通信,通过特有零知识证明来解决用户隐私问题。

2018-09-30

bancor协议白皮书

bancor协议是目前区块链研究的一个重要方向,跨链不同的TOKEN之间的兑换一直是一个问题,这里给出一个解决的方案。

2018-09-29

以太坊上PBFT的实现

针对以太坊的POW算法的一种改进方式,引入了PBFT的算法,论文主要从原理上阐述了实现的过程。

2018-09-29

DERP白皮书

DREP区块的白皮书,是一个新的区块链的技术,如果大家对这个感兴趣,可以下来看看。

2018-09-29

交流电能表检定装置(JJG电表、台体)

这是最新的国家标准,主要是国家电网的电能表和台体的计量检定规程。用到的下。

2009-04-29

朗新WEBSERVER接口(南网和天津电网)

适用于朗新目前的所有接口,平台语言C#,主要是对电力系统SG186的跨平台调用。也适于于同样的WEBSERVER工程跨平台使用。使用说明书已打在压缩包里。

2009-03-16

GO区块链中这段代码的意思,求教

发表于 2017-06-30 最后回复 2017-06-30

c#调用axis的webservice

发表于 2008-10-30 最后回复 2014-12-02

C#调用ibatisnet的DAO问题

发表于 2012-08-15 最后回复 2013-01-02

dm9000驱动问题

发表于 2011-06-22 最后回复 2012-11-28

linux下文件可以看到但不可以使用

发表于 2010-05-14 最后回复 2012-11-23

单独编译QTE键盘驱动

发表于 2010-05-25 最后回复 2012-11-23

configure和 qmake -project后如何删除生成的文件

发表于 2010-07-27 最后回复 2012-11-23

LDD3中SCULL问题

发表于 2008-07-03 最后回复 2012-11-23

在WINDOWS上开发的QT程序,如何交叉编译,然后下载到开发板中使用。

发表于 2010-04-21 最后回复 2012-11-23

qt4中的触屏时好时坏

发表于 2010-04-28 最后回复 2012-11-23

vs2010调用PYTHON的一个错误

发表于 2011-12-29 最后回复 2012-05-07

单文档CListCtrl的ON_NOTIFY_REFLECT无效

发表于 2011-12-07 最后回复 2011-12-09

SQL列的动态连接

发表于 2011-04-07 最后回复 2011-12-08

EBOOT问题

发表于 2011-06-03 最后回复 2011-06-16

BS还是CS,纠结

发表于 2011-04-19 最后回复 2011-04-19

C#在PC上写的程序可否直接转到WINCE6

发表于 2011-04-14 最后回复 2011-04-14

GRPS拨号打包到内核问题

发表于 2009-12-29 最后回复 2010-10-22

UCOS中断无法进入问题

发表于 2009-05-13 最后回复 2010-09-09

水晶报表分组,怎样不显示空白行?

发表于 2007-11-03 最后回复 2010-08-28

谁有“ARM嵌入式LINUX系统开发技术详解”的光盘资料发我一份。

发表于 2009-03-31 最后回复 2010-08-09

高手介绍一下SOCKET编程

发表于 2010-06-30 最后回复 2010-07-01

图像非均匀性校正

发表于 2010-03-23 最后回复 2010-06-25

编译QTE中间件错误

发表于 2010-05-26 最后回复 2010-05-28

VC如何读取点阵数据为灰度图

发表于 2010-03-16 最后回复 2010-03-18

数据表部分重复,合并后导入新表方法。

发表于 2010-03-14 最后回复 2010-03-16

LINUX突然出现错误

发表于 2010-03-01 最后回复 2010-03-01

WINCE中SOCKET遇到10004错误程序就崩溃

发表于 2010-01-11 最后回复 2010-01-13

socket套接字的conncet始终返回0

发表于 2009-12-03 最后回复 2009-12-07

RAS拨号监视消息

发表于 2009-11-16 最后回复 2009-12-04

WINCE串口通信为什么为串包

发表于 2009-11-26 最后回复 2009-11-26

wince上开发asp.net程序

发表于 2009-10-28 最后回复 2009-11-16

DLL内存释放错误

发表于 2009-10-21 最后回复 2009-10-22

timeSetEvent多媒体定时器可不可以长期使用

发表于 2009-09-25 最后回复 2009-09-29

多线程SOCKET通信间的数据问题

发表于 2009-09-21 最后回复 2009-09-21

两个CString相加为什么不对

发表于 2009-09-14 最后回复 2009-09-14

DS32安装SOFTICE错误

发表于 2008-07-31 最后回复 2008-10-30

c#导出EXCEL问题

发表于 2008-06-28 最后回复 2008-07-03

exists的问题

发表于 2008-06-25 最后回复 2008-06-25

C# TextBox子类化问题

发表于 2008-04-01 最后回复 2008-04-01

调用OCX的问题,C#或VB。NET都可以在添加到工具栏里。但调用出错。

发表于 2006-12-25 最后回复 2006-12-28

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除