自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Erick Lv的笔记

所有的博客仅作为个人笔记

  • 博客(523)
  • 资源 (4)
  • 论坛 (1)
  • 收藏
  • 关注

原创 C++字节存储方式和reinterpret_cast

数据存储方式和数据类型变量变量可以认为是一个内存块,该内存块中存放了变量的二进制表示格式。其实,汇编语言中,没有变量类型的概念,而在C等静态高级语言中,都有变量类型的概念。1字节 = 1B = 8bit = 2^8 => 0-256所以ASCII标准字符有256个,sizeof(int) = 4,因此int最大是2(8×4−1)2^{(8 \times 4 - 1)}2(8×4−1),-1是因为有符号位可以这么理解,变量类型只是程序员告诉编译器变量的表示方式;而最终的汇编形式,仍然是没有数据

2020-10-27 13:51:30 113

原创 std::any

std::any可以认为,这是C语言void*的高阶版本,直接给出代码实例:#include <iostream>#include <any>#include <variant>#include <type_traits>#include <vector>struct Op1 {};struct Op2 {};void test(const std::vector<Op1>&) { std::cou

2020-08-17 14:16:18 64

原创 Java基础总结--1

基础部分Java的String是不可变对象,比如:public class Foo { public static void main(String arg[]) { String s = "hello world"; String s1 = s + " !"; // 追加字符 String s2 = s.s.substring(0, 5) + " foo"; }}s1和s2是会共享原来s的字符的。如果经常变化字符串,可以使用StringBuilder,可以与String互相转化

2020-07-23 21:44:17 70

原创 boost context上下文切换

上下文简介首先要理解boost::context的概念和应用场景。程序在执行的时候,当前的执行的代码环境和所处的状态,就是context。boost::context保留了当前程序执行时的寄存器等的状态,可以认为是一个上下文A;然后线程就可以去执行其他的代码,完成执行后,可以切回上下文A,并从当初切走的地方执行,而且当初的上下文的现场不变,这就是完成了一次真正意义上的上下文切换。上线文切换,在协程和用户态线程等有重要的意义(统称它们为routine),我们可以启动一定数量的操作系统的线程,然后让rout

2020-07-19 20:57:32 354 1

原创 C++重载->和*运算符

->和*也可以用于重载,不过这种模式不太常见。最经典的例子是智能指针。直接给出一个简版的unique_ptr的代码示例,说明这两者的重载模式:#include <iostream>template <typename T>class UniquePointer {public: UniquePointer(T* val = nullptr) { m_val = val; } ~UniquePointer() { // 退出时

2020-07-14 00:17:14 54

原创 C++类型萃取 -- 1

std::enable_if_t#include <iostream>#include <type_traits>#include <string>template<typename T, typename = std::enable_if_t<(sizeof(T) > 2)>>void foo(const T&& val) { std::cout << val <&lt

2020-07-07 17:07:51 67

原创 C++ 可变索引模板 和 template template

代码实例:#include <iostream>#include <deque>template <typename T>class MyContainer {public: void push(T&& arg) { m_que.emplace_back(std::forward<T>(arg)); } T pop() { auto&& v = m_que.fr

2020-07-03 19:18:02 85

原创 C++模板元编程---折叠表达式

折叠表达式同样是运行在编译期间的,先给出基本的规则:注意,一元表达式只有&&、||或者,有缺省值,三者空包的默认值分别是:true、false和void()所有支持的运算符是:+ - * / % ^ & | = < > << >> += -= *= /= %= ^= &= |= <<= >>= == != <= >= && || , .* ->*给出一元折叠代码示例:#

2020-06-27 18:54:11 151

原创 C++模板元 -- 变长参数模板

变长参数模板边长参数模板的一般格式是:// 编译递归的终止位置template <T arg>void foo(T arg) { // do something with arg}// 展开编译表达式template <typename T, typename ...Args>void foo(T arg, Args... args) { foo(arg, args...);}给出代码示例,注意都是编译器展开的代码模板,而非运行期。#include

2020-06-27 18:26:25 171

原创 理解C++ Executor的设计理念

文章目录简介代码示例参考简介很多时候,我们的可调用对象需要某些非参数依赖的执行环境。可以这么理解,我们的任务是就绪的,不需要依赖外界传入参数了,只需要以某种方式控制方法的when 、where和how即可。三个分别是指:where:可调用对象的执行位置,比如可以在内部或者外部的处理器(线程)上执行,并从内部或者外部的处理器(线程)上获取结果when:可调用对象的执行时间,比如立刻执行或者被调度执行how:可调用对象的执行方式,比如在CPU或者GPU上执行,可以矢量化计算等举个例子:int

2020-06-25 19:59:55 478

原创 Ubuntu18.04安装facebook folly库

安装步骤ubuntu18.04安装的boost有点陈旧,因此自行下载最新版本,执行安装即可:https://www.boost.org/具体步骤直接参考readme安装gtest:wget https://github.com/google/googletest/archive/release-1.8.0.tar.gz && \tar zxf release-1.8.0.tar.gz && \rm -f release-1.8.0.tar.gz &&amp

2020-06-20 01:11:39 126

原创 CMake总结笔记1

总结笔记

2020-06-20 01:09:28 73

原创 计算机网络总结

计算机网络基础TCP连接Unix中的EOF,可以参考这里:https://en.wikipedia.org/wiki/End-of-file总结为:读取数据时,数据流结束的标记。比如在读取标准输入的时候,我们输入EOF符号,来通知程序终端输入结束了,因为程序不知道标准输入什么时候为结束。同样的,TCP是面向流的,因此也需要EOF机制来通知通信的对方,自己的数据流结束了。3次握手的过程:...

2020-03-20 14:18:18 137

原创 Golang的GC和内存逃逸

简介每个版本的Golang的垃圾回收都在不断优化中,而且方法和策略都在变化,因此这里只是总结出以下几个关键点:什么样的数据需要GC触发GC的条件是什么GC时发生了什么能否从代码层面上提高GC的效率GC的基本流程Golang在确定的时间,或者内存分配到达一定程度时,进行GC。GC时,会停止STW(Stop The World),即对外的服务都会暂停,然后进行垃圾回收处理。Go1.1...

2020-03-01 22:35:58 524

原创 Golang的协程调度

调度的基础,模型关系的映射GPM模型:G,Goroutinue被调度器管理的轻量级线程,goroutine使用go关键字创建调度系统的最基本单位goroutine,存储了goroutine的执行stack信息、goroutine状态以及goroutine的任务函数等。默认的大小是2KB,根据需要逐步上涨。G绑定到P上执行P,Processor逻辑执行单元存储了M执行的上下...

2020-03-01 20:33:17 448

原创 slice和map的高级主题

slice基础的内存模型:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U4eCAPE8-1583047423727)(en-resource://database/904:1)]传入一个slice占用24字节,分别是ptr、len和cap,分别一个字节。append会再slice后面追加元素,具体参考代码1cap没满的情况下,直接在后面的内存上追加数...

2020-03-01 15:24:25 99

原创 一致性哈希

问题背景假设有N台redis作为缓存,传统的Hash算法是:ser = hash(k) % N,即对键值哈希,然后对服务器的个数取余,这样做简单、而且分布均匀,但是有两个问题:- 假设有服务器x发生了宕机,那么此时取余命中x是失效的,我们需要对键值进行相应的迁移,把服务器变成N-1台,但是这样面临服务器一定时间不可用的情况,造成redis雪崩- 假设容量不够,我们需要扩容,此时新加入服务器后...

2020-02-26 21:43:15 127

原创 redis缓存雪崩、缓存穿透和缓存击穿等总结

redis作为缓存互联网高并发请求数据的情况,可能出现频繁访问MySQL的情况,但是MySQL由于自身的特性,可能无法抗住这么大的压力,因此我们想利用redis存储一些MySQL中的数据,redis作为缓存时,一般有以下几个场景:数据的一致性不是强制的比如查询UV的次数,允许和数据库有一些不一致,更新redis是异步的。而像支付等,是强一致性的,则不能使用缓存(只是举个例子),redis更...

2020-02-23 22:49:07 365

原创 CMake构建工程

目标:使用CMake构建多级的目录的C++项目,包含动态库的引用。文件结构:.├── CMakeLists.txt # 1├── build├── lib # 这里存放动态库│ ├── CMakeLists.txt # 2│ ├── lib-bye │ │ ├── CMakeLists.txt # 3 │ │ └── bye.cc # 4│ └──...

2020-02-23 02:52:30 168

原创 编译过程、静态库和动态库

C/C++代码到可执行文件从代码到最终的程序,分为4个步骤,分别是:预编译:编译预处理,比如#define和#ifndef之类的,C++的inline也是在这期间处理的编译:把代码转换成汇编,包括词法分析、语法分析和语义分析等汇编:把汇编语言转换成机器码,输出的是目标文件。比如*.o的文件链接:把目标文件聚合成可执行文件链接:链接本质上是把多个ELF文件,按照符号符号等拼接成执行文...

2020-02-23 00:35:36 254

原创 boost.asio无锁异步并发

简介给出一个不安全的情况,假设我们有一个socket用于和用户通信,用户会发送多个请求,我们处理请求需要一定的时间,同时使用异步并发的模型来处理对应的请求,即一个io_context::run会有多个线程执行。那么boost::asio的基本代码框架如下,给出伪代码示例:var scoket; // 一个socketasync_read(socket, buf, [](){ // 处理一...

2020-02-21 17:11:27 443

原创 boost.asio异步并发Tcp服务器

简介reactor模式proactor模式异步并发模型说明代码示例基于boost 1.70和C++14CMakeLists.txt# cmake_minimum_required(VERSION <specify CMake version here>)project(boost_asio)set(CMAKE_CXX_STANDARD 14)set(CMAKE_C...

2020-02-19 23:08:47 505

原创 Reactor和Proactor模式

简介Reactor和Proactor都是基于事件的并发模型。除了基于事件外,还有基于线程的并发模型。这里先简单介绍下两种的特点以及区别。基于线程的模型主要有两种模型:每个客户端的连接分配一个线程,每个线程独立的处理连接。有一个线程池,每个客户端的生命周期都拥有一个线程。可以看出,这两种方式的核心思想都是,每个连接,都独立地拥有一个线程,这个线程伴随着该连接的整个生命周期。这种方式...

2020-02-19 22:51:55 57

原创 MySQl索引基础

基础的索引类型以及优缺点平衡树基础InnoDB引擎的平衡树采用B+Tree索引,先分析B-Tree和B+Tree的结构特点,以及为什么采用B+Tree结构。B-Tree结构:图中的数字都是键值,Data表示对应键值的数据,每个节点都有自己的键值和对应的数据,但是有对应的范围,介于[m2,m][\frac{m}{2}, m][2m​,m]之间。键值采用搜索平衡树的方式排列,而且中序遍历一...

2020-02-19 12:40:52 43

原创 TCP协议总结

TCP三次握手和4次挥手:四次挥手中,Server端发送FIN,是因为有些情况下,可能存在客户端发送完FIN之后,还存在一些未完成的数据,因此让服务器发送FIN表示数据已经发送完了。在建立完TCP链接之后,Server对client的每个数据都会发送一个ack验证,这保证了数据传输的可靠性。MSS:Max Segment Size 最大片段长度,TCP把数据封装成帧,这是只数据不会被IP层...

2020-02-18 00:05:41 158

原创 kafka保证数据可靠性的方式

可靠性保证和复制机制Kafka的以下几个基本特性保证了基本的可靠性:Kafka保证一个分区的消息是FIFO的只有消息写入了所有分区的同步副本时,才认为是已提交的只要有一个副本活跃,则消息就不会丢失消费者只能读取已提交的消息生产者可以进行有关配置,使得不一定等到数据认为是已提交的之后,才进行下一轮的投递,这是在可用性和一致性的之间的平衡分区副本复制方式和同步条件:每个分区所在的...

2020-02-17 16:56:11 100

原创 Kafka原理

Kafka的复制和备份关于分区的几个总结:一个分区a有一个首领broker A,且a是首领分区一个分区可以在多个broker中存在副本,此时这些副本都是复制的首领分区的内容,而且生产者和消费者操作分区时,必须是首领分区。如果一个broker失效,而且该broker中有一个或者多个首领分区,那么其余包含这些首领分区副本的broker,会重新选举并接替这个broker中首领分区的领导权。对应...

2020-02-16 21:34:43 79

原创 kafka基础笔记

基础概念kafka是一个消息队列系统,不同的生产者和消费者,可以向kafka写入自己的数据,实现数据的流动;kafka解耦了生产者和消费者,它的ack机制保证了消息传递的可靠性,借助zookeeper等实现了分布式的消息队列。生产者可以根据需要向不同的主题写入数据,为了减少累计的网络IO时间,可以把多个消息积累到一个批次中统一发送。消费者可以组成消费者组的概念,消费者组可以订阅主题,kafk...

2020-02-15 00:12:24 72

原创 Zookeeper启动和Leader选举机制

Zookeeper启动流程zookeeper服务器有4个状态:LOOKING:寻找LeaderFOLLOWING:作为FollowerLEADING:作为LeaderOBSERVING:作为Observer集群版zk服务器启动状态:初始化Leader选举,这期间包括给自己投一票注册JMX服务检测当前服务器的状态,初始化一般时LOOKINGLeader选举过程同步状态向...

2020-02-06 11:41:44 197

原创 zookeeper的会话

zookeeper 会话事务:能改变zookeeper一致性的操作都是事务,比如添加节点、删除节点和更新数据等。zk为每个事务分配一个唯一的zxid,用于标记事务的顺序。对于竞争,zk使用乐观锁的保证高效性。过程如下:获取znode的版本执行操作更新数据时,重新获取版本,并比对版本的序号,如果一致则执行更新一个客户端会话包含4个核心的数据:sessionId:会话唯一的IDT...

2020-02-06 11:39:52 163

原创 Zookeeper应用场景

数据订阅发布场景需求服务器需要即使获取更新的数据集群中有多台服务器,一旦数据更新,所有的服务器都要第一时间获取更新为了减少网络IO,这些服务器不能经常查询数据状态ZK实现ZK建立特殊的目录存放数据需要数据的机器,订阅对应的目录,如果数据发生变换,则ZK主动通知订阅了的机器机器收到ZK的通知后,读取对应目录的数据说明:ZK存储的这些数据,数据量一般不会太大(最多可能一般几十...

2020-02-06 11:32:44 86

原创 C++智能指针的“GC”

C++的智能指针使用了引用计数来自动释放内存,因此释放内存并检查的过程,可以视为“GC”,比如有大量智能指针的节点,一次性reset指针的时候,可能会有卡顿,给出一个例子,创建50w个节点,观测GC的耗时:#include <iostream>#include <memory>#include <chrono>struct LinkNode { ...

2020-01-10 02:22:49 166

原创 二叉树中最大的二叉搜索子树

问题描述思路和代码暴力方法是每个节点为根节点,然后判断以该节点为根节点的树是否是二叉搜索树,然后求规模最大的,这种方式的时间复杂度是O(N2)O(N^2)O(N2),空间复杂度是O(h)O(h)O(h)。搜索二叉树左子树所有的数据都小于等于根节点,右子树所有的数据大于等于根节点;定义是递归的。如果左子树,有一个节点不满足,那么整个左子树都不是二叉搜索树,右子树同理。后序遍历的特征是,我们能...

2020-01-07 20:57:54 131

原创 二叉树最长路径

问题描述思路和代码参考https://blog.csdn.net/qq_35976351/article/details/103864846

2020-01-07 17:24:12 1109 2

原创 区间内累加和为规定值的最长子序列

问题描述给定一个未排序序列和一个值N,然后求解该序列中的一个连续子序列,使得这个子序列s的累加值等于N,而且s是所有子序列中最长的。要求时空复杂度都是O(N)O(N)O(N)思路和代码首先,需要解决的是未排序的情况,参考资料https://www.jianshu.com/p/028055303e3bhttps://blog.csdn.net/gkq_tt/article/detail...

2020-01-07 11:13:30 442

原创 打印二叉树的边界节点

问题描述从根节点起,逆时针输出二叉树所有的边界节点:根节点每层最左侧节点每层最右侧节点底层的所有叶子节点,比如14、15等。上述的结果是:1 2 4 7 11 13 14 15 16 12 10 6 3空间限制是O(h)O(h)O(h),时间限制是O(N)O(N)O(N),hhh是树的高度,NNN是节点的个数。思路和代码需要的节点分为三种:左边界:一层中最左侧的节点...

2020-01-06 20:31:18 248

原创 非递归遍历二叉树

后续遍历暂时没写,留作后期补充#include <iostream>#include <stack>struct Node { int val; struct Node *left{nullptr}, *right{nullptr}; Node (int n = 0): val(n), left(nullptr), right(nullptr...

2020-01-03 17:25:39 46

原创 链表根据主元切分成3段

把链表根据给定的主元重新排序,使得比主元小的在左侧,中间是主元,大的在右侧。思路,不创建新的节点,但是利用原来结构创建3个新的链表,之后拼接,代码如下:#include <iostream>#include <utility>#include <algorithm>template<typename T>struct Node { ...

2019-12-26 22:44:38 49

原创 单调栈和单调队列的应用即总结

单调栈单调栈的基础结构是“栈”,即元素是LIFO的,只能从栈顶控制数据出入;单调表示从栈的一端到另一端遍历,元素是单调递增或者单调递减的。比如单调递减栈,从栈底到栈顶的元素可以是:bottom 10 7 5 3 2 1 top单调队列参考文献https://endlesslethe.com/monotone-queue-and-stack-tutorial.htmlhttps://...

2019-12-25 20:19:38 88

原创 单调栈及其应用

单调栈应用参考资料https://blog.csdn.net/roufoo/article/details/78569554https://blog.csdn.net/yutianzuijin/article/details/52072427

2019-12-18 21:02:29 62

code reading

Coding Reading 英文原书,主要讲述了高效阅读源代码的方式。磨刀不误砍柴工,很有学习的价值

2018-06-07

Mastering BLockchain

精通区块链。区块链书籍,入门用的,英文原书,非常好的学习资料

2018-06-02

BTree数据结构课程设计C++版

BTree数据结构课程设计C++版,完整的过程和C++源代码,包括算法的源代码等。C++代码可以直接运行。

2018-01-15

Effective Modern C++英文原书

Effective Modern C++英文原书,主要讲解了C++11/14的新特性,适合C++进阶阅读。英文资料,可以提高英文水平。Effective系列的经典书籍

2018-01-15

Erick_Lv的留言板

发表于 2020-01-02 最后回复 2020-01-02

空空如也

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

TA关注的人 TA的粉丝

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