小不点的博客

关于计算机学习方面的总结
私信 关注
zhangyin_blog
码龄3年
  • 79,800
    被访问量
  • 69
    原创文章
  • 68,603
    作者排名
  • 34
    粉丝数量
  • 于 2018-04-08 加入CSDN
获得成就
  • 获得37次点赞
  • 内容获得12次评论
  • 获得155次收藏
荣誉勋章
兴趣领域
  • #数据库管理
    #数据库开发
TA的专栏
  • C/C++
    21篇
  • Linux
    4篇
  • 数据结构
    8篇
  • 高级数据结构
    5篇
  • 网络编程
    9篇
  • JavaScrip
  • lua
    10篇
  • c#
    5篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

C#委托

委托:类似于C/C++中函数的指针 是存有对某个方法的引用的一种 引用类型变量 引用可在运行时被改变委托特别用于实现事件回调方法 所有的委托都派生于System.Delegate类声明委托 public delegate int Test(string s) 可被用于引用任何一个带有单一string参数的方法 并返回一个int型变量一旦声明了委托类型 委托类型必须使用new关键字来创造...
原创
117阅读
0评论
1点赞
发布博客于 2 年前

C#特性

特性:用于在运行时传递程序中各种元素(类 方法 结构 枚举 组件)的行为信息的声明性标签 特性用于添加元数据一、预定义特性 AttributeUsage Conditional Obsolete[AttributeUsage(validon,AllowMultiple = allowmultiple,Inherited = interited)]* validon:规定特性可被放置的语...
原创
480阅读
0评论
0点赞
发布博客于 2 年前

C#简单数据结构

一、数据类型值类型:int char float bool byte double long short uint ulong ushort decimal(128位精确的十进制值)引用类型:不包含存储在变量中的实际数据 但它们包含对变量的引用 指向的是一个内存位内置的引用类型:object dynamic string*object对象类型是C#通用类型系统中所有数据类型的...
原创
139阅读
0评论
0点赞
发布博客于 2 年前

C#继承

继承本质 重用代码继承的思想实现了 属于 is-a的关系* 继承的特点* 1.派生类是对基类的扩展 派生类可以添加新的成员 但是不能移除已经继承的成员的定义* 2.继承是可以传递的 如果C从B中派生 B又从A中派生 那么C不仅继承了B中声明的成员 同样也继承了A中声明的成员* 3.构造函数和析构函数不能被继承 除此之外其他成员能被继承 基类中成员的访问方式只能决定派生类能否访问...
原创
81阅读
0评论
0点赞
发布博客于 2 年前

C#静多态与动多态

多态的本质:一个接口 不同实现 即多个功能类别:静多态 动多态一、静多态函数的响应是在编译时发生的 主要包括函数重载和运算符重载两种函数重载(overload)同一作用域 方法名相同 参数列表必须不同 返回值类型可以不相同 其中参数列表不同包括参数类型不同或者参数个数不同运算符会出新博客具体讲二、动多态函数的响应是在运行时发生的动多态是由抽象类和虚方法实现 代码如...
原创
127阅读
0评论
0点赞
发布博客于 2 年前

lua调用c模块 c模块编写注意点

编写主旨是:编写的c函数都是static的 对外是私有的的 只提供一个外部公共的接口创建C模块第一步:编写要注册的c函数 eg:static int add(int x,int y){return x+y;} static int sub(int x,int y){return x-y;}第二步:将要注册的C函数通过类型为lua_Reg的数组保存 保存两个字段 字符串 = 函数指针co...
原创
126阅读
0评论
0点赞
发布博客于 2 年前

宏的高级用法

1.# 出现在宏定义中的#是把跟在后面的参数转成一个字符串2.## 是一种分隔符 先分隔 在强制连接注意点:当宏函数中再次调用相同宏函数的时候 括号里的宏函数不会展开#define TOSTR(moudle) #moudle#define TOSTRCAT(x, y) (x##y)int main(){ char *pstr = TOSTR(add); ...
原创
193阅读
0评论
1点赞
发布博客于 2 年前

Lua继承的实现

实现继承的原理:利用table中的元表来实现 __index__index元方法:用于查看表中元素或方法是否存在 如果不存在则返回nil 如果存在 则返回__idnex表中的结果--单一继承的实现 利用元表来实现继承Account = {name = "lili", balance = 10}function Account:widthdraw(value) self.balanc...
原创
338阅读
0评论
0点赞
发布博客于 2 年前

lua算数类元方法操作两个table举例

--找到表中最后一个元素的下标function tableMax(t) local count = 0 for k,value in ipairs(t) do if (count < k) then count = k end end return count endlocal mt = {} mt. __add = function(mytable,n...
原创
318阅读
0评论
0点赞
发布博客于 2 年前

Lua元表的理解(二) __index __newindex 的实践

一、具有默认值的table --通过__index实现首先 我们都知道table中的任何字段的默认值是nil 我们可以通过元表来修改table的默认值function setDefault(t, d) local mt = { __index = function() return d end} setmetatable(t, mt)endfunction main() l...
原创
99阅读
0评论
0点赞
发布博客于 2 年前

lua元表的理解(一) __index __newindex

元表本质上来说是一种用来存放元方法的table 通过对应的key来得到value的值 作用就是修改一个值的行为 这种修改会覆盖原本该值可能存在的相应的预定义行为lua中的每个值都可以有一个元表 只是table和userdata可以有各自独立的元表 而其他类型的值共享其类型所属的单一元表lua代码只能设置table的元表 其他类型值的元表只能通过C代码设置多个table可...
原创
415阅读
0评论
0点赞
发布博客于 2 年前

Lua调用c模块

一、lua调用c模块总结1.c函数库成为lua的一个模块主要做法:将包含c函数的代码生成库文件 linux下是.so windows下是.dll 同时拷贝到lua运行环境的bin下(由于我用的是LuaTool运行环境 所以放在bin下 程序运行默认从bin下找) 这样lua解析器才可以找到.dll文件2.编写c模块 (1)先编写需要注册的c函...
原创
4879阅读
0评论
0点赞
发布博客于 2 年前

lua中点号和冒号的用法以及面向对象编程的基本实现原理

Lua面向对象编程一、面向对象特征封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性继承:继承的思路允许在不改变源程序的基础上对其进行扩充 使得原功能得以保存,新功能得以扩展多态:同一操作作用于不同的对象 可以有不同的解释 产生不同的执行结果 在运行时 可以通过基类的指针来调用实现派生类的方法抽象:简化复杂的显示问题的途径 可以为具体问题找到最恰当的类...
原创
158阅读
0评论
0点赞
发布博客于 2 年前

lua中的位运算

lua5.1不支持位操作 自己实现--数字转二进制 代码如下 其中需要注意的地方是 num = num / 2 并不像C中只得整数部分 所以需要处理一下值 用到了lua中math库的math.modf()函数 函数用法如下所示print(math.modf(12.34)) ---》 12 0.34数字转二进制代码--数字转二进制function ToSecond(num)...
原创
2479阅读
3评论
0点赞
发布博客于 2 年前

lua编写模块

编写模块注意的地方:1.模块名必须与文件名相同2.创建局部表来封装模块 达到私有性 共有性3.将局部表赋给模块名后 摆脱函数对模块名的依赖 这样改变模块名只需改变文件名即可4.利用环境解决 函数和变量依赖局部表名的调用5.利用环境会造成当前环境不能访问外部的全局变量 可以通过设置元表 让当前全局变量_G继承外部的_G方法一创建一个table 并将所有需要导...
原创
203阅读
0评论
0点赞
发布博客于 2 年前

lua中require、dofile、loadfile对比

一、requirerequire(moduleName):用来加载模块;其参数只要是文件名即可;利用模式匹配搜索加载文件;require只会被调用执行一次,会判断文件是否被加载避免重复加载;(1)模式匹配require的路径是一个模式列表,每一个模式指明一种由虚文件名(require的参数)转成实文件名的方法;每一个模式是一个包含可选的问号的文件名。匹配的时候Lua会首先将问号用虚文...
原创
204阅读
0评论
0点赞
发布博客于 2 年前

JavaScript简单使用实例

        首先,我所认识理解的JavaScript是给我们固有的网页添加一些功能,是这些网页面向用户体验更加完美。所以要使用JavaScript,必须是在HTML+CSS的基础上实现的。说白了JavaScript就是给网页中的某些按钮、文本框中加入特效。       编写JavaScript的流程:        1.要有基础的页面布局HTML+CSS        2.要确定修...
原创
189阅读
1评论
3点赞
发布博客于 2 年前

C语言模拟C++多态

typedef void(*FUN)();//重定义一个函数指针类型struct Base{ FUN f;//由于C语言中结构体不能包含函数 只能用函数指针在外面实现};struct Derive//本派生类只继承了父类 他自己没有自己的部分{ Base b;//在子类中定义一个基类的对象即可实现对父类的继承};void FunB(){ printf("%s
",...
原创
120阅读
0评论
1点赞
发布博客于 3 年前

typedef与define的区别

(一)typedef(1)typedef 为某一种类型引入新的名字 ,并不为变量分配内存空间(2)不可以同时将多个声明放在一个typedef(3)举例说明typedef int KeyType //为int引入新名字int a ;//定义一个整型变量aKeyType b;//定义一个整型变量btypedef int* ptr,(*fun)(),arr[5];/*...
原创
1332阅读
0评论
2点赞
发布博客于 3 年前

常见STL容器总结

/*STL容器主要分为顺序容器   vector(向量容器) deque(双端队列容器) list(双向链表)关联容器   set(单重集合)  multiset(双重集合)  map(单重映射表) multimap(多重映射表)容器适配器 stack(栈) queue(队列) prority_queue(优先级队列)*/(一)vector向量容器1.包含在头文件#include...
原创
2931阅读
0评论
1点赞
发布博客于 3 年前

关于数组的剑指offer习题

(一)二维数组中数字的查找此二维数组的特点每一行都按照从左到右递增 每一列都按照从上到下递增题目要求:给定这样一个数组和一个整数 查找这个整数是否在数组中解题思路:由于题中所所述的二维数组的特点 从二维数组最后一列的第一个元素arr[row][col-1]找起 如果要找的数字大于arr[row][col] 则直接跳到下一行   由于arr[row][col]前面的数字都小于...
原创
137阅读
0评论
0点赞
发布博客于 3 年前

判断完全二叉树和满二叉树

(一)判断完全二叉树特点一:只允许最后一层有空缺结点且空缺在右边,即叶子结点只能在层次最大的两层上出现; 特点二:对任一结点,如果其右子树的深度为j,则其左子树的深度必为j或j+1 即度为1的点只有1个或0个 解题思路:首先一棵空树是完全二叉树利用队列 先将根节点入队 只要当前节点不为NULL 先从队列front()得到一个节点 并将吹对节点的左右孩子入队 如果存在只有一...
原创
7388阅读
3评论
5点赞
发布博客于 3 年前

二叉树常见面试题

(一)求二叉树和为某一值的路径//二叉树中和为某一值的路径44void findpath(BstNode* ptr,int sum,int&amp; cur,vector&lt;BstNode*&gt; &amp;vec){ cur += ptr-&gt;data; vec.push_back(ptr); //如果当前节点为叶子节点并且cur == sum 满足要求 打印v...
原创
1043阅读
0评论
0点赞
发布博客于 3 年前

二叉树的镜像

纠正一下上图中的描述 只要当前节点有孩子就交换 也包括只有一个孩子的情况递归代码 void MirrTree(BtNode* ptr) { // 树空 指向树的根节点为空 if(ptr == NULL) return ; //只有根 不需要交换 if(ptr-&gt;leftchild == NULL &amp;&amp; ptr-&...
原创
66阅读
0评论
0点赞
发布博客于 3 年前

二叉树简单操作

(一)求二叉树的深度如果一棵树只有一个结点,那么它的深度为1;如果根结点只有左子树没有右子树,那么树的深度是左子树的深度加1,加1是加上根节点这一层如果既有左子树又有右子树,那么树的深度应该是左、右子树中深度较大的值再加1递归代码int Depth1(BtNode* ptr){ if(ptr == NULL) return 0; int nleft = Depth1(p...
原创
79阅读
0评论
0点赞
发布博客于 3 年前

简单二叉树

二叉树的基本结构typedef char KeyType;#define END '#'typedef struct BtNode{ BtNode* leftchild; BtNode* rightchild; KeyType key;}BtNode,*BinaryTree;二叉树的建立//购买节点BtNode* BuyNode(){ BtNode* s = ...
原创
218阅读
0评论
0点赞
发布博客于 3 年前

判断大端小端以及模拟htons函数

大端:指的是一个整数的高位字节存放在内存的低地址处小端:指的是一个整数的低位字节存放在内存的低地址处现代PC大多采用的是小端字节序,又称为主机字节序,而网络中传输数据时使用的是大端字节序,又称为网络字节序如何判断大小端呢?代码如下://判断大端或者小端void IsPort(){ union { short int a;//短整型两个字节 char b[size...
原创
249阅读
0评论
0点赞
发布博客于 3 年前

I/O复用之poll

函数功能:在一段在指定的时间内,监听用户感兴趣的可读、写、异常事件函数原型:int poll(struct pollfd* fds,nfds_t* nfds,int timeout)   fds:指向所有感兴趣的文件描述符上的可写、可读、异常事件,它是一个结构体的数组类型,每个格子都包含以下内容:struct  pollfd{  int fd;//文件描述符  short ...
原创
98阅读
0评论
0点赞
发布博客于 3 年前

I/O复用之select

函数功能:在一段时间内,监听用户感兴趣的文件描述符上的可读、可写与异常事件函数原型:int select(int nfds,struct fd_set *readfds, struct fd_set *writefds,struct fd_set *execptfds,struct timeval * timeout)nfds:要监听的最大文件描述符加1; readfds:监听用户感兴趣的...
原创
79阅读
0评论
0点赞
发布博客于 3 年前

网络编程中的细节问题

(一)socket阻塞与非阻塞问题在创建socket函数中的第二个参数types用来指定服务类型,在Linux2.6.17版本起,除了之前的SOCK_STREAM(流式服务)、SOCK_UGRAM(数据报服务)以外,又增加了SOCK_NONBLOCK和SOCK_CLOEXEC,分别表示将创建的socket设置为非阻塞的和用fork创建的子进程在子进程中关闭该socket;第一个问题:如何将...
原创
213阅读
0评论
0点赞
发布博客于 3 年前

网络编程总结(C/S)

(一)TCP编程流程服务器端编程流程/*第一步:创建socket int socket(int domain.int type,int protocol)成功时返回一个socket 失败时返回-1并设置errordomain:告诉系统使用哪个底层协议族 PF_INET(ipv4) PF_INET6(ipv6)type:指定服务类型 SOCK_STREAM(流服务) SOCK_UGRA...
原创
491阅读
0评论
0点赞
发布博客于 3 年前

malloc与free、new与delete

(一)malloc与free1.void *malloc(int size);它的返回值为void*,表示分配的堆内存的起始地址,返回值可以被强转为任何类型的指针;并且malloc函数分配得到的内存空间是未初始化,一般要调用memset函数将其初始化为0;void *memset(void *p,int c,int n);该函数可以将指定的内存空间按字节单位置为指定的字符c;...
原创
50阅读
0评论
1点赞
发布博客于 3 年前

指针与数组的比较

数组有两种创建方式,一种是在全局静态存储区创建(全局数组),一种是在栈上创建;(1)数组名对应的是一块内存而不是指向,地址和容量不允许改变,只允许改变内存里的内容;         指针可以指向任意类型的内存块,它是可变的,常用指针操作动态内存 接下来以字符串为例来说明两者的区别(2)大小不同    char str1[] = "hello";大小为6个字节,表示存放6个字符的...
原创
623阅读
0评论
0点赞
发布博客于 3 年前

内存管理以及常见内存泄漏处理

(一)内存分配方式(1)从静态存储区域分配;内存在程序编译的时候就已经分配好,这块内存在程序整个运行期间都存在;例如全局变量、static变量(2)在栈上创建;在执行函数时,函数调用会开辟栈帧空间,内部的局部变量的存储单元都存在于栈空间,函数体执行完成后这片空间自动被释放(3)在堆上分配;即就是我们常说的动态内存分配。程序运行期间通过malloc或new申请任意多少内存,程序自己负责在...
原创
229阅读
0评论
0点赞
发布博客于 3 年前

快排三种基本解法以及两种快排优化

/* 快速排序 基本思想   选定每次排序的基准数据 在剩下的位置将小于基准值的数据放在基准值得左边,大于基准值的数据放到基准值的右边   一次划分之后 如果此基准值的左右两边仍存在大于两个数据  则继续划分排序 直至每个数字都有序  递归实现Quick_Sort1(int *arr,int len):快排一次划分的时间复杂度为O(logn) 最坏就是在有序条件下 时间复杂度为O(n^2...
原创
3979阅读
0评论
4点赞
发布博客于 3 年前

常见排序总结

/*选择排序每一趟选取第i个关键字,与剩下的n-i关键字进行比较,找出最大的值与刚开始选择的i下标对应的值交换第一趟: 0 , 1~n-1第二趟:1, 2~n-1.....应用场景  最好最坏情况时间复杂度都是O(n^2) 空间复杂度为O(1)  最坏情况:对相对有序的一组数据排序  不稳定 由其交换引起的  适用于数量不大并且交换次数少的情况下*/void Selec...
原创
108阅读
0评论
0点赞
发布博客于 3 年前

进程及多进程编程

                                                                              第一部分  进程知识总结 一、进程的定义进程是执行中的程序,就类比于一出舞台剧的整个表演过程;进程动态性的实质是进程实体的执行过程;进程独立性是指每个进程都有自己的PCB;进程的并发性是内存中可以允许存在多个进程实体,并且可以同时运行一...
原创
8354阅读
1评论
2点赞
发布博客于 3 年前

继承与多态

一、继承继承1.本质:实现代码复用2.继承与派生 基类Base   派生类Derive 基类Base派生了派生类Derive 派生类Derive继承了基类Base Derive is a kind of Base  比如学生是人 但是人不一定是学生 继承方式:public protected private 3.继承的内容   基类的成员变量 成员方法 作用域 4.不被继承...
原创
126阅读
0评论
0点赞
发布博客于 3 年前

指针和引用的区别

指针和引用的区别 1.相同点  (1)底层处理方式相同    int a = 10;  int *p = &amp;a;  int &amp;b = a;   对于指针p:lea eax [a]             mov drop ptr [p] eax   对于引用b:lea eax [a]             mov drop ptr [b] eax 2.不同点  ...
原创
117阅读
0评论
0点赞
发布博客于 3 年前

指针和引用作为返回值

一、 函数返回值     1.如果返回值小于4byte 用寄存器eax带回返回值     2.如果返回值大于4byte小于8btye,用两个寄存器eax edx带回返回值     3.如果返回值大于8byte,在调用前main函数中产生临时量接受返回值 二、临时量生成的三种情况     1.函数调用之前产生,目的是为了接受函数的返回值     2.函数的return语句处     ...
原创
1738阅读
0评论
1点赞
发布博客于 3 年前

extern关键字的用法

extern关键字的用法1.引用同一工程下不同文件下的全局变量 a.cpp int data = 10; b.cpp extern int data ;cout&lt;&lt;data&lt;&lt;endl;//success a.c int a = 10; b.c extern int a; printf("%d
",a);//success 不管是在 .c还是.c...
原创
236阅读
0评论
0点赞
发布博客于 3 年前

C和C++中的const关键字

(一)C和C++中的相同点1.const 修饰指针  const与一级指针结合  int const *p;  const int *p;----&gt;p为常量指针 p指向的内容不可改 p的指向可以改  int *const p;----&gt;p为指针常量 p的指向不可改  指向的内容可改  const int *const p----&gt;p的指向和指向的内容都不可改  c...
原创
81阅读
0评论
0点赞
发布博客于 3 年前

二叉搜索(排序)树-----BSTree树

/*BST树:二叉排序树 二叉搜索树BST树的结构typedef int ElemType ;typedef struct BstNode{    BstNode* leftchild;//左节点    BstNode* rightchild;//右节点    BstNode* parent;//父亲节点    ElemType data;//数据域}BstNode,*BSTr...
原创
716阅读
0评论
0点赞
发布博客于 3 年前

TCP/IP协议之ip协议详解

 
原创
92阅读
0评论
0点赞
发布博客于 3 年前

数据结构之栈

(1)栈:其特点是数据遵循“先进后出”的原则,是一个由低地址向高地址增长的。(2)分类:定长顺序栈、不定长顺序栈、链式栈(3)代码如下:#define SIZE 10typedef int ElemType;typedef struct Stack{ ElemType elem[SIZE]; int top;//栈顶指针,标记当前可以存放数据的下标}Stack,*PSta...
原创
51阅读
0评论
0点赞
发布博客于 3 年前

数据结构之静态链表

静态链表:静态链表的结构:(1)整体是一个数组,包括data域和next域;其中next保存的是下一个格子的下标,并且最后一格保存空闲链的表头;(2)静态链表有两条链,0号下标是有效链的表头;1号下标是空闲链的表头;(3)在判断链表是否为满的时候只要看空闲链的表头next域的数据是否是1,如果是1就证明已满;     在判断链表是否为空只要看有效链表头next域存储的数据是否是0,如果是0...
原创
652阅读
0评论
1点赞
发布博客于 3 年前

数据结构之队列

(一)队列(1)概念  是运算受到限制的线性表,只允许在表的一端进行入队,在另一端进行出队;通常我们在尾部进行入队(rear),在对头就行出队(front)。头删和尾插的时间复杂度都为O(1);(2)分类循环顺序队列 1.入队时采用尾插,时间复杂度是O(1);出队时由于每次在对头删除一个数据就需要将后面的数据统一往前挪,时间复杂度要有O(n);为了降低复杂度,我们通常将其设置成...
原创
56阅读
0评论
0点赞
发布博客于 3 年前

数据结构之顺序表

(一)顺序表(1)概念:一种顺序存储结构;顺序表上的元素按照一定逻辑顺序存储一段连续的存储空间相邻的两个元素在物理位置上也相邻 可以随机访问顺序表中的元素(下标访问)。(2)分类定长顺序表,其存储单元大小不变,具有局限性;不定长顺序表,其存储单元大小可变,当存储空间满了之后插入元素时可进行自动扩充;(3)下列主要写出了不定长顺序表的代码,定长顺序表与不定长在操作上基本相同,除了...
原创
66阅读
0评论
1点赞
发布博客于 3 年前

数据结构之单链表简单操作

(一)单链表单链表结构:数据域_data和指针域_pnext,其基本操作如下列代码所示,附有注释说明://单链表结构typedef int ElemType;typedef struct Node{ ElemType _data; struct Node* _pnext;}Node,*PClist;//购买节点Node* BuyNode(){ Node* pnod...
原创
89阅读
0评论
0点赞
发布博客于 3 年前

C++默认的六个函数

(一)构造函数1.构造函数:CMyString(){} (1)函数名与类名相同 无返回值      对象构造时系统自动调用相应的构造函数    构造函数可以重载 可以在类内或者类外定义(指定作用域即可) (2)初始化列表比函数内初始化更高效   对于自定义类型,在初始化时系统会自动生成初始化列表,即系统会先走一遍初始化列表,   然后在调用函数体内的初始化,也就是初始化了两遍;所...
原创
185阅读
0评论
1点赞
发布博客于 3 年前

字符串常见操作

(一)字符串基本操作(1)字符串拷贝//字符串拷贝bool Mystrcopy( char *des,const char *src){ if(des==NULL||src==NULL) { return false; } while(*des++=*src++); return true;}(2)字符串连接//字符串连接char *Mystrcat(c...
原创
151阅读
0评论
0点赞
发布博客于 3 年前

阻塞与非阻塞,同步与异步

(一)小情景模拟阻塞与非阻塞,同步与异步所需材料:本人、普通水壶、水开后会发出响声的水壶情景一:我主动用普通水壶去烧水(主动请求事件:同步),并且一直站在旁边等待水开(等待数据准备好在进行下一步,阻塞),然后做饭;     同步阻塞情景二:我主动用普通水壶去烧水(主动请求事件)不需要一直检测,每隔一段时间会过来看水是否开了(没有一直等待事件:非阻塞,但还是存在主动查看事件的行为),一直...
原创
131阅读
0评论
0点赞
发布博客于 3 年前

TCP/IP中的拥塞控制

(一)慢开始和拥塞避免算法(二)快开始和快恢复 
原创
844阅读
0评论
0点赞
发布博客于 3 年前

TCP四次挥手终止连接的TIME_WAIT状态

(1)存在TIME_WAIT状态的原因    首先,只有主动调用closed的一方才会在接收到对端的ACK后进入time_wait状态;并且任意一方都可以先发起closed;下图为四次挥手状态:原因一:保证TCP全双工连接的可靠释放解析:假设场景为客户端主动向服务器发起断开连接,假如在主动方(客户端)最后一次发送的ACK在网络中丢失,根据TCP的超时重传机制,被动方(服务器)需要重新...
原创
4256阅读
0评论
1点赞
发布博客于 3 年前

TCP/IP三次握手建立连接和四次挥手终止连接

(一)三次握手建立连接(1)首先服务器端进行初始化,由最初的closed状态顺序调用socket、bind、listen后进入listen状态;(2)客户端进行初始化,由最初的closed状态顺序调用socket、connect主动连接服务器套接字进入SYN_SENT状态(向服务器发送将SYN置为1的同步数据段);(3)服务器接收到SYN后向客户端发送将SYN置为1的同步数据段和ACK...
原创
5389阅读
0评论
0点赞
发布博客于 3 年前

单例模式的实现

(一)单例模式的设计目的单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点;(1)基于全局访问点的思想,很容易想到定义全局或者静态对象,但是这样不能保证该类只声明一个静态对象,并没有实现仅有一个对象的思想;(2)单例模式设计方式  将类的构造函数写在私有下; 定义一个静态的指针指向该类唯一的对象; 定义一个公有下返回该对象的静态方法代码如下://单例模式 c...
原创
2010阅读
1评论
0点赞
发布博客于 3 年前

IA之32位体系下Linux系统下虚拟地址映射(下)

   在上篇我们讲到段机制实现了逻辑地址到线性地址的映射,接下来检测是否开启分页机制,如果未开启分页机制此时的线性地址就是物理地址;如果开启了分页机制,那么此时的线性地址(虚拟地址)需要经过多级页表映射找到其物理地址。    在介绍之前我们先认识了解一下CPU中的寄存器,主要分为三类,如下图所示:对于页表映射机制来说根据CPU位数的不同,他们的页表映射级数不同,32位为二级映射,36位...
原创
198阅读
0评论
0点赞
发布博客于 3 年前

如何实现一个不被继承的类?

(一)单例模式下的不被继承的类从继承的特性来说,派生类继承其基类的私有成员,但是不可访问;派生类的构造要先调基类的构造函数构造基类然后在调自己的构造函数构造自己;我们可以将基类的构造函数写在private下,那么基类此时就是一个不被继承的类;但是这样基类是不可被继承,但同时他也不会正常实例化对象,因为不可访问其私有成员;这时我们可以借助单例模式来实现,通过静态方法实现返回一个对象,但是这种实例...
原创
704阅读
0评论
0点赞
发布博客于 3 年前

从编译链接的ELF结构看static关键字

本文主要讨论static在C++中的应用(1)static修饰全局变量和局部变量全局变量属于数据,不是放在.data段,就是在.bss段;如果是一个常量字符,那么存储于.rodata段;局部变量属于指令,存储于.text段,运行时系统为其分配栈上空间,函数的局部变量此时表示栈上的一段内存;那么加了关键字之后有何变化呢?请看如下代码:int gdata1 = 10;//全局变量...
原创
353阅读
0评论
0点赞
发布博客于 3 年前

直接插入排序和选择排序

(一)直接插入排序思路:(1)用一个临时变量存放待排序的数字;(2)从数组前依次遍历找第一个比待排序数字大的数字的位置;(3)将从待排序的数字位置开始,到找的要插入的数字的位置之间的数字向后挪一位,最后将待排序数字插入到找到的位置;代码如下:void Insert_Sort( int *arr,int len ){ int tmp = 0;//当作哨兵位 ...
原创
7246阅读
0评论
0点赞
发布博客于 3 年前

IA之32位体系下Linux系统下虚拟地址空间映射(上)

(一)inter X86体系发展(1)在8080-8085这两种体系中,CPU位数均为8位,也就意味着ALU(算术逻辑单元)一次能够计算的整数的最大字节数为1byte,即ALU的宽度为8位,数据总线的条数为8条;地址总线的条数为16条,可寻址能力为2^16=64k,;(2)在8086又开始了一个新的体系,CPU位数为16位;从80386之后CPU位数就真正开始为32位,地址总线为20条。...
原创
347阅读
0评论
0点赞
发布博客于 3 年前

Linux进程间通讯方式

我们常常使用的进程间通讯主要有信号、管道、共享内存、消息队列、信号量、socket这六种方式。(一)信号(1)它是一种通知机制;一种提前定义好的某些特定事件。信号可以被产生也可以被接收;信号最重要的就是如何发送信号,如何修改响应方式?Linux下支持的信号,举例有:SIGCHLID:表示子进程终止,默认对此信号的响应方式是“SIG_IGN”忽略;SIGINT:表示用户产生终止符,默...
原创
200阅读
0评论
1点赞
发布博客于 3 年前

C++编译链接全过程

今天博文主要讨论的问题是:我们编写的程序代码是怎样运行起来的?到底运行的是什么内容?平时我们所说的编译主要包括预编译、编译、汇编三部分,这三部分分别都干什么工作,主要职能有哪些,接下来我们一步步探讨总结。(一)预编译(1)由源文件“.cpp/.c”生成“.i”文件,这是在预编译阶段完成的;gcc -E .cpp/.c ---&gt;.i(2)主要功能 展开所有的宏定义,消除“#de...
原创
6897阅读
2评论
7点赞
发布博客于 3 年前

C/C++中static关键字的用法

(一)变量的分类变量可以分为全局变量、静态全局变量、静态局部变量和局部变量这四种。这几种变量的特点如下:(1) 按存储区域分,全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。(2) 按作用域1.全局变量在整个工程文件内都有效;2.静态全局变量只在定义它的文件内有效;3.静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,...
原创
356阅读
0评论
1点赞
发布博客于 3 年前

C++总结2—shared_ptr交叉引用及多线程安全问题

智能指针是存储指向动态分配对象指针的类,用于生存期控制;能够确保正确销毁动态分配的内存,防止内存泄露。本博文参考博客https://blog.csdn.net/yusiguyuan/article/details/40628805(1)智能指针的分类1.不带引用计数的智能指针auto_ptr 、unique_ptr、 scoped_ptr2.带引用计数的智能指针shared_ptr强智...
原创
1917阅读
1评论
0点赞
发布博客于 3 年前

C++总结1—shared_ptr

一、智能指针介绍(1)C++11:头文件&lt;memory&gt;     aotu_ptr(已经在C++11中不使用了)     缺点:智能指针的设计必须要符合实际指针的应用---可以允许多个指针指向同一块空间,将一个指针赋值给另一个指针时这 两个指针都可以指向统一空间;而auto_ptr的设计方式只允许一块空间上只能有一个指针指向它;\     unique_ptr(就是boost库中的sc...
原创
59阅读
0评论
0点赞
发布博客于 3 年前

剑指offer编程题二

(1)题目:在一个二维数组中,每一行都按照从左往右递增的顺序排序,每一列都按照从上到下递增的顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断该整数是否在其中;思想:首先从大方向上看,由于每一行都按照从左往右递增的顺序排序,每一列都按照从上到下递增的顺序排序,所以每一列第一位都是本列中最小的数字,每一行最后一位都是本行最大的数字了,那么问题就简单了,我们从最后一列找起,l 如果给出的...
原创
63阅读
0评论
0点赞
发布博客于 3 年前

C++中动态开辟二维数组

方法一:申请空间时使用数组指针,分配一个指针数组,将其首地址保存在arr中,在为指针数组的每个元素分配一个数组;释放空间时需要先释放二维数组中每个元素指向的数组,在释放该指针数组;代码如下: int rows ; cin&gt;&gt;rows; int cols ; cin&gt;&gt;cols; int **arr = new int*[rows];//先使一个二级...
原创
3608阅读
0评论
2点赞
发布博客于 3 年前

春招笔试编程题(一)

(1)判断一个ip地址是否合法?解题思想:只要含有非数字字符出现就不合法;只要以‘-’开头就不合法;点分十进制法表示ip地址只含有三个‘.’,违背此规律就不合法;每个以‘.’分割部分的数字都必须在0-255范围内;在判断数字是否合法时必须先将数字字符转换成数字,比如“123”--&gt;123;代码如下:bool Is_Right(const char* str){ int count = ...
原创
93阅读
0评论
0点赞
发布博客于 3 年前