自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(21)
  • 收藏
  • 关注

原创 const 用法

一,修饰变量(定义常量)const int n=5;int const n=5;//与前面一种写法等价修饰的局部变量在初始化之后,变量的值不能被改变。声明同时给变量赋值。#define和const有什么区别const 定义的常数是变量是带类型的, #define 定义的只是个常数是不带类型的;#define MAX 255 // 不带类型,在预处理的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换。const float MAX = 255; // 带类型,存放在内存的静

2021-06-20 20:18:05 228

原创 lambad表达式

lambda表达式又称匿名函数(Anonymous function),其构造了一个可以在其作用范围内捕获变量的函数对象。声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。以更直接的方式去写程序,好的可读性和可维护性。简洁:不需要额外再写一个函数或者函数对象,避免了代码和功能分散,让开发者更加集中精力在手边的问题,同时也获取了更高的生产率。灵活性:在需要的时间和地点实现功能闭包,使程序更灵活。lambda表达式声明和定义[ capture ] ( param

2021-06-20 17:36:41 401

原创 C++和python的区别

C++和python的区别C++执行效率高,编程难(开发效率低);python执行效率低,编程简单(开发效率快;C++ 为编译性编程语言,Python 则为解释性编程语言(Java,C#等都是解释型语言)。编译型语言在程序执行之前,有一个单独的编译过程,将程序翻译成机器语言,以后执行这个程序的时候,就无需再进行编译,直接允许可执行文件即可。解释型语言是指使用专门的解释器对源程序进行逐行解释成特定平台的机器码并立即执行的语言。解释型语言通常不会进行整体的编译和链接处理,解释型语言相当于把编译型

2021-06-19 19:58:18 18376

原创 互斥锁、自旋锁、读写锁、条件锁、悲观锁、乐观锁

一. 互斥锁(Mutex)互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作(如修改)一个共享资源。如果占用共享资源的线程释放互斥量时,有一个以上的线程阻塞,那么所有该锁上的阻塞线程进入准备就绪状态(其中也包括释放锁的线程,该线程也会进入就绪队列),准备就绪状态的所有线程,通过竞争,进入运行状态,然后竞争获取锁资源。二. 自旋锁(Mutex)自旋锁是一种非阻塞锁,也就是说,如果某线程需要获取自旋锁,但该锁已经被其他线程占用时,该线程不会被挂起(不

2021-04-30 22:03:58 887 1

原创 堆原理与用法

一. 常用堆函数相关函数定义在头文件#include1.创建堆 make_heap()make_heap()该函数默认生成大顶堆。有第3个参数,可以用来指定一个比较函数用于堆的排序。vector<double> numbers{2.5,10.0,3.5,6.5,8.0,12.0,1.5,6.0};//默认生成大顶堆make_heap(begin(numbers), end(numbers));//{12 10 3.5 6.5 8 2.5 1.5 6}// make_heap(num

2021-04-25 22:02:39 143

原创 二叉树前序、中序、后序遍历、层序(广度优先)遍历、深度优先遍历具体代码实现

1. 前序遍历// 递归实现void preOrder(TreeNode* root){ if(root != nullptr){ cout<<root->data<<" "; preOrder(root->left); preOrder(root->right); }}// 迭代实现void preOrder(TreeNode* root){ if(root == nullptr)

2021-04-25 20:34:31 164

原创 Nagle算法

Nagle算法TCP是基于流的传输协议,在Rlogin和Telnet传输中会出现只有一个字节数据(载荷数据)的TCP数据包。IP(20)+TCP(20+)+载荷数据构成三层传输报文,若载荷数据只有几个字节,这会造成头重脚轻,显然是不合理的,也未能有效的利用报文资源。Nagle算法基本思路就是,在发送缓冲区中的数据大小不足一个MSS时,要求TCP连接上最多只能有一个未被确认的小分组,在该分组的确认到达之前不能发送其他的小分组。。数据在发送端被缓存并超过MSS,此时使用连续ARQ协议,意思就是可以连续发出若

2021-04-23 22:04:59 1584

原创 linuxc/c++内存对齐

为什么要内存对齐?尽管内存是以字节为单位,但是大部分处理器并不是按字节块来存取内存的.它一般会以双字节,四字节,8字节,16字节甚至32字节为单位来存取内存。现在考虑4字节存取粒度的处理器取int类型变量(32位系统),该处理器只能从地址为4的倍数的内存开始读取数据。假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔除不想要的字节(0地址),然后从地址4开始读取下一个4字节块,同样剔除不要的数据(5

2021-04-19 21:50:07 208

原创 信号量

linux sem 信号量是一种特殊的变量,访问具有原子性, 用于解决进程或线程间对共享资源引发的同步问题。信号量通过一个计数器控制对共享资源的访问,信号量的值是一个非负整数,所有通过它的进程/线程都会将该整数减1。如果计数器大于0,则访问被允许,计数器减1;如果为0,则访问被禁止,所有试图通过它的线程都将处于等待状态。对共享资源使用完毕,计数器加1。信号量和互斥锁(mutex)的区别:互斥锁只允许一个线程进入临界区,可用于进程/线程的互斥,而信号量允许多个线程同时进入临界区,可用于进程/线程的同步。

2021-04-19 09:56:57 273

原创 条件锁(条件变量)

条件锁就是所谓的条件变量,某一个线程因为某个条件为满足时可以使用条件变量使改程序处于阻塞状态。条件锁强调的是条件等待而不是互斥,条件锁会阻塞当前线程,直到某个条件成立才会继续向下执行。条件变量是线程可用的另一种同步机制。互斥量用于上锁,条件变量则用于等待,并且条件变量总是需要与互斥量一起使用,运行线程以无竞争的方式等待特定的条件发生。条件变量本身是由互斥量保护的,线程在改变条件变量之前必须首先锁住互斥量。其他线程在获得互斥量之前不会察觉到这种变化,因为互斥量必须在锁定之后才能计算条件。如果条件不满足,则

2021-04-19 09:54:45 3297

原创 vector数组

vector扩大容量的本质当 vector 的大小和容量相等(size==capacity)也就是满载时,如果再向其添加元素,那么 vector 就需要扩容。vector 容器扩容的过程需要经历以下 3 步:1. 完全弃用现有的内存空间,重新申请更大的内存空间;2. 将旧内存空间中的数据,按原有顺序移动到新的内存空间中;3. 最后将旧的内存空间释放。由于vector 容器在进行扩容后,内存空间可能位置发生改变,因此与其相关的指针、引用以及迭代器可能会失效。vector 中存储的内容默认是在堆中分配的,旦

2021-04-18 21:59:26 138

原创 内存泄漏的后果?如何监测?解决方法?

内存泄漏是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的情况。内存泄漏并非指内存在物理上消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制;1) 内存泄漏分类(1)堆内存泄漏 (Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak. 另外,没有将基

2021-04-18 21:20:39 444

原创 malloc/free 和 new/delete 详解

C语言提供了malloc和free两个系统函数,完成对堆内存的申请和释放。而C++则提供了两个关键字new和delete;malloc/free 和 new/delete配对使用,避免内存泄漏和多重释放。应避免交叉使用,比如malloc申请空间delete释放,new出的空间被free,因为delete对象的时候会调用析构函数,free不会,另外new/delete类对象时会调用operator new/delete函数。对于基本类型数据的申请和释放两者可以交叉使用,编译器不会报错。但对于自定义类型数据,

2021-04-18 20:48:07 438

原创 TCP流量控制和拥塞控制

  为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认。连续ARQ(Automatic Repeat reQuest)协议在滑动窗口协议得到了应用。。  滑动窗口协议(Sliding Window Protocol),属于TCP协议的一种应用,用于网络数据传输时的流量控制,可以用来避免网络拥塞(拥塞控制)和接受端来不及接受的情况(流量控制)发生。该协议允许发送方在停止并等待确认前发送多个数据分组。

2021-04-17 21:46:51 1018

原创 C++二分查找相关函数用法总结

一、lower_bound()函数函数lower_bound(begin,end,num)在begin和end中的前闭后开区间,进行二分查找。返回从begin开始的第一个大于或等于val的元素的地址。如果所有元素都小于val,则返回end的地址。注意:如果所有元素都小于val,则返回end的位置,且end的位置是越界的!!数组必须是排好序的数组(升序)。#include<algorithm>// lower_bound(a.begin(), a.end(), 11) 等同于 a.

2021-04-17 17:05:12 3313

原创 DPDK初识

一、DPDK原理网络设备(路由器、交换机、媒体网关、SBC、PS网关等)需要在瞬间进行大量的报文收发,因此在传统的网络设备上,往往能够看到专门的NP(Network Process)处理器,有的用FPGA,有的用ASIC。这些专用器件通过内置的硬件电路(或通过编程形成的硬件电路)高效转发报文,只有需要对报文进行深度处理的时候才需要CPU干涉。但在公有云、NFV等应用场景下,基础设施以CPU为运算核心,往往不具备专用的NP处理器,操作系统也以通用Linux为主,网络数据包的收发处理路径如下图所示:操作系

2021-04-16 21:25:39 160

原创 linux进程内存分布与管理

一、进程内存分布  一个程序的进程本质上都是由bss段、data段、text段三个组成的。可以看到一个进程在存储(没有调入内存)时分为代码段、数据区和未初始化数据区三部分,如下所示:BSS段(未初始化数据区):通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态分配,程序结束后静态变量资源由系统自动释放。数据(data)段(已初始化数据区):存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配。代码段(text段):存放程序执行代码的一块内存区域。这部

2021-04-15 21:35:19 966

原创 引用和指针

引用和指针的区别(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。(2) 引用不可以为空,当被创建的时候,必须初始化,初始化后就不会再发生改变;而指针可以是空值,可以在任何时候被初始化,指针的值在初始化后可以改变,即指向其它的存储单元。(3) 可以有const指针,但是没有const引用;(4) ”sizeof引用”得到的是所指向的变量(对象)的大小,而”sizeof指针”得到的是指针本身的大

2021-04-14 23:11:21 104

原创 TRIE(前缀树)

Trie 树也称字典树、前缀树,单词查找树等,是一颗非典型的多叉树模型。1. Trie树设计// 节点表示struct TrieNode { bool isEnd; //该结点是否是一个串的结束 TrieNode* next[26]; //字母映射表};包含三个单词 “sea”,“sells”,“she” 的 Trie树,如下图所示:2. Trie树常用操作(1)插入首先从根结点的子结点开始与 word 第一个字符进行匹配,一直匹配到前缀链上没有对应的字符,这时开始不断开

2021-04-14 16:48:49 121

原创 网络字节序和主机字节序

主机字节序就是自己的主机内部,内存中数据的处理方式(不同的CPU具有不同的字节序类型),可以分为两种:1. 大端字节序(big-endian)按照内存的增长方向,将高序字节存储在起始地址;最符合人的思维的字节序 , 因为地址低位存储值的低位 ,地址高位存储值的高位。2. 小端字节序(little-endian)按照内存的增长方向,将低序字节存储在起始地址;最直观的字节序,因为地址低位存储值的高位 ,地址高位存储值的低位。// 内存中双字 0x01020304(DWORD...

2021-04-13 21:36:53 334 1

原创 TCP粘包/拆包的产生原因和解决办法

TCP底层不了解应用层数据的含义,它会根据TCP缓冲区的实际情况进行包的划分,所以业务上认为,一个完整的包(应用层数据)可能被TCP拆分为多个包进行发送,也可能把多个小包封装成一个大的数据包进行发送,这就是所谓的TCP粘包和拆包问题。出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。拆包和粘包是在socket编程中经常出现的情况,在socket通讯过程中,如果通讯的一端一次性连续发送多条数据包,tcp协议会将多个完整的消息(应用层数据)打包成一个tcp报文发送出去,这就是所谓的粘包。而如果通

2021-04-13 21:13:32 4383 1

空空如也

空空如也

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

TA关注的人

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