自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 lua 冒号和点调用函数的一些问题

lua中函数的调用可以是用冒号调用,也可以使用点调用,其二者的区别是使用冒号调用的时候会隐式的将调用函数的调用者作为第一个参数赋值为self,就可以在函数里面直接使用self来获取调用者的里面的数据。使用点调用的话,可以直接使用调用者来获取数据。我遇到如果问题:local tbl = { func = function(tmp) print(tmp) end,}function test() tbl.func() tbl:func()end结果为niltable: 0x1

2021-07-07 15:19:33 584 2

原创 《unix编程艺术》第十三章 复杂度

第十三章 复杂度 尽可能的简单,但不要简单过了头复杂度的来源1、代码量:代码的总行数2、实现复杂度:一个程序员从理解程序从建立思维模型到能够调用程序的困难程度3、接口复杂度:用户界面接口的使用复杂度,记忆负担越大,复杂度越大易于陷入的三种陷阱:1、manularity(人力尺度): 主要是为了避免接口的复杂度,将许多的底层实现任务都抛给用户。2、belivet(硬撑):主要为了避免代码量,而将程序设计非常晦涩的算法。3、adhocity(过专):主要是为了避免程序的实现复杂度,而对于每一个单

2020-10-12 18:00:49 257 1

原创 《unix编程艺术》第十二章 优化

第十二章 优化  最好的优化就是不做优化12.2 先估量,再优化  在有真凭实据证明程序运行缓慢时,才考虑进行优化,在优化前要先估量再进行实施。  要先明确程序的瓶颈在那里在开始进行优化,使用性能剖析程序profiler来进行估量。使用工具的出现的几个主要的问题体现在:工具本身自己运行而产生的误差;外部的时延;过度的调用图中顶部的节点。  将收集到的数据进行数学模型,进行分析,得出结果,得知问题出现的原因,在进行优化。12.3 非定域性之害  最有效的优化方法是保持代码的短小简单,永远不要将核

2020-10-12 11:02:54 158

原创 《unix 编程艺术》第十一章 接口

第十一章 接口 Uinx环境下的用户接口设计模式  一个程序启动之后通常通过以下三个方式来获得输入和命令:  1、通过标准输入进行获取  2、通过进程间的通信就是获取数据 IPC  3、通过已知位置的文件或设备进行输入数据11.1 最小立异原则的应用  最好避免设计一个全新的接口框架,尽量效仿类似的功能接口  如果可能的话,尽量将接口的功能用熟悉的程序来代替,如果不能的话,就效仿熟悉的程序来设计,尽量使用熟悉的设计让用户更好的使用。11.2 Unix接口设计的历史  1980年后,unix

2020-10-09 19:33:32 181

原创 《unix编程艺术》第十章 配置

第十章 配置 迈出正确的第一步10.1 什么应是可配置的  对于unix程序员而言,一切都可配置  对于能够可靠地进行自动检测的东西,就不要提供配置的开关,尽量用自动检测来减少配置开关的数量,后者在运行时不断尝试其他方法直到成功。如果觉得这个办法不够好,想一想是不是过早的优化了。 当想增加配置选项的时候,需要考虑以下问题: (1)能不能省掉这个功能,为什么除了增加用户手册的厚度之外还会增加用户的负担。 (2)能否用某种无伤大雅的方式改变程序的常规行为而无需这个选项。 (3)这个选项是否真的有用

2020-09-28 09:49:52 85

原创 《unix编程艺术》第九章 生成

第九章 生成:提升规格说明的层次尽可能的把设计复杂度从程序代码转移到数据是一个好实践,选择便于人类维护和操作的数据表示也是一个好实践数据比程序更易驾驭 9.1 数据驱动编程 将代码和代码作用的数据结构划分清楚,改变程序逻辑时,只需要 编辑数据结构 而不需要改动代码 数据驱动编程和面向对象的区别(OO 主要是以数据组织为中心的风格) 1、数据编程中,数据不仅仅是某个对象的状态,还定义了程序的控制流; 2、面向对象中,首先考虑的是封装,而数据驱动编程看重的是编写尽可能少的固定的代

2020-09-25 11:03:21 79

原创 centos7使用tar命令出现错误:gzip: stdin: unexpected end of file

错误描述:这个错误出现在windows上直接将压缩包拖进虚拟机,然后解压出现的错误,原因可能是压缩包不完整,解决办法:1、可能原来的压缩包就是不完整的,可以尝试重新下载新的压缩包2、如果确保原来的压缩包是完整的,可以通过其他路径将压缩包拷进虚拟机(不管是虚拟机上的linux还是远程的linux的服务器,可以通过远程连接linux,将文件传输上去,可以使用SSH Secure File T...

2020-04-08 12:52:00 1574

原创 linux U盘的挂载和卸载

通过使用 fdisk -l 命令查看当前的分区情况,当有U盘接入的时候,最下方会有如下打印:说明u盘现在在/dev/sdb1然后使用mount 命令将u盘挂载下来,一般我们都把外部设备挂载在 /mnt目录下,所以 我们使用mount  /dev/sdb1  /mnt如果需要卸载U盘,可以使用umount  /dev/sdb1 或者 umount /mnt注意:...

2020-03-24 22:04:00 754 1

原创 Linux 目录文件显示绿色高亮的问题

在我们使用linux操作系统的时候,会有一些小问题引起我们的注意,比如下面的问题:这里的 home2 文件被标记为绿色高亮,而其他的目录文件比如 home 文件,却是什么也没有,这是为什么呢?      这是因为其他组权限里面有写入的权限,linux系统认为这是一个高风险的目录文件,因为任何人都可以进入到该目录并进行写入操作,所以就将该目录用...

2020-03-18 15:44:53 9187 2

原创 windows上lua环境的配置

1.进入网站https://joedf.ahkscript.org/LuaBuilds/2.下载想要使用的lua版本3.将下载玩的压缩包进行解压4.将解压后的文件所在的文件所在的路径加在系统的环境变量的最前面,后面再加上分号,比如 C:lua5.进入命令行界面,输入lua,出现如下字段:C:\Users\shengyou.tu>luaLua 5.3.5 Copyright © ...

2019-11-06 18:31:27 147

原创 C++多重继承带来的构造函数的执行顺序的问题

在C++中是支持多重继承,而继承也分为虚基类的普通的基类,在派生类里面可能还有其他类的成员对象,自身还有自己的构造函数,这些夹杂在一起,导致我们不能立即判断出每一个构造函数的执行顺序,现在就来测试一下吧。class Base{public: Base() { cout << " this is Base" << endl; }};class VBa...

2019-08-15 11:36:53 541

原创 C++ list容器的splice方法

list容器底层实现是一个带头结点的双向链表,由于链表的每个节点是单独开辟的,所以链表在移动数据,或者两个链表之间移动数据的时候,直接把节点摘下来,接入到新的位置就可以了,效率比较高。splice方法就是将list的元素进行拼接,原理就是改变结点指针的指向,效率比较高。先看看这splice方法的三种声明:(1)void splice ( iterator position, list&lt...

2019-05-26 12:59:15 3230

原创 STL容器之vector容器的resize和reserve函数的区别

vector:vector的底层实现是一个可2倍扩容的数组,刚开始时候是没有空间的,随着元素的增加而进行二倍的扩容,扩容的方式为0-1-2-4-8-16…所以vector的内存使用的效率比较低,一般使用reserve来进行优化。现在就来讲讲reserve和resize函数的区别:reserve这个函数的功能为给容器预留空间而不会增加元素的个数,而resize这个函数不仅会给vector开辟空...

2019-05-23 12:36:45 403

原创 守护进程

什么是守护进程?在《Linux环境高级编程》中,这样定义:&nbsp 守护进程也称为精灵进程是一种生存期比较长的进程,它们常常在系统自举时启动,仅在系统关闭时才终止,因为它们没有控制终端,所以说它们是后台运行的。它是脱离终端控制的进程,原因为:守护进程是不希望终端产生的命令影响进程的执行,也不希望守护进程的一系列的输出自举:计算机开机时的加电自检和磁盘引导,加电自检就是进行判断是否...

2019-05-20 20:23:50 141

原创 I/O复用之epoll以及其ET/LT实现

epoll和select以及poll不一样,它是linux独有的一种方法,在linux2.6.11内核版本之后才能够使用。epoll的实现原理和poll、select不一样,首先他最大的不同就是它是按照一组函数来指执行的,其次,它把用户关心的文件描述符上的事件放在内核的一个事件表中,这个事件表的底层实现是红黑树,所以无需每次将文件描述符或事件集传入函数中,但epoll需要一个特别的文件描述符来唯...

2019-05-13 17:34:53 277

原创 I/O复用之poll

poll系统调用的实现原理和select类似,都是在指定的时间内轮询一定数量的文件描述符,以测试其中是否有就绪的文件描述符。相关的select可参考我写的关于select的文章I/O复用之select。poll的原型如下:#include<poll.h>int poll (struct pollfd* fds, nfds_t nfds, int timeout);fds 参...

2019-05-13 12:41:07 95

原创 I/O复用之select

什么是I/O复用,简单的说就是将所有的文件描述符统一管理起来,包括连接套接字和监听套接字,当其中某些文件描述符有事件发生,也就是文件描述符就绪了,服务器对于有事件发生的文件描述符做recv 操作。通过一个线程或进程管理多个文件描述符。现在来介绍一下select函数,它是一个系统调用函数,原型如下:int select (int maxfd, fd_set *readfds, fd_set *w...

2019-05-08 21:29:23 109

原创 指针定义相关的用法:

int a; //定义一个整型的变量 a;int a[];//定义一个整型数组;int *a ; //定义一个整型指针int a();//声明一个返回类型为整型,参数列表为空的函数名为a的函数int (*a)[10];//定义一个指向一个元素类型的整型,元素个数为10的数组的指针int *a[10];//定义一个元素类型为整型指针,元素个数为10的数组int *a(); //定义声...

2019-05-04 11:51:07 114

原创 什么是内存对齐以及作用

什么是内存对齐?为了解释这个问题,先来介绍下面的例子:#include<iostream>using namespace std;struct A{ char a; short b; int c;};struct B{ short b; int c; char a;};int main(){ cout<<sizeof(A)&...

2019-05-04 11:15:47 5370

原创 系统调用函数和库函数的区别

系统调用函数:一台计算机的最低层是硬件设备,通过操作系统来管理这些硬件,如果操作系统是封闭的则这些硬件将无法被其他程序来使用。我们知道操作系统本身也是一个程序,只不过是系统级别的,为了能让其他的程序也能够访问这些硬件设备,操作系统给出了一些接口,这些接口就是我们所说的系统调用函数。通过这些接口就可以访问计算机的硬件设备。系统调用函数运行在系统的内核态,而调用则由用户调用,所以在用户态。这里就需要...

2019-05-02 12:00:43 693

原创 C++学习笔记之继承和多态

在C++中类和类的基本关系有:代理、组合、继承代理:可以从容器适配器中可以体现,就是一个类是另一个类的接口,通过这个类,可以访问另一个类的方法。组合:就是一个类是另一类的成员,用一个类定义的对象,作为另一个类的成员变量继承:简单的说,一个类拥有另一个类的成员或方法现在就来介绍一下继承继承方式:派生类的内存布局:派生类不仅有自己的成员还直接或间接地继承了基类的成员,最重要的是派生类还...

2019-05-01 18:58:43 121

原创 详解TCP协议

TCP的主要特点:1、TCP是面向连接的运输层协议。在应用程序使用TCP之前,必须要建立TCP连接。在数据交互完成之后,必须要进行释放连接,不然之前建立的连接的端口会被内核维护,使得不能再使用这个端口号了。整个过程就像是在打电话:打电话前,必须要进行拨号建立连接,才能进行通话,通话结束之后就要进行挂机释放连接,不然电话线路一直占用着,其他的电话打不进来。2、每一条TCP连接只能够有两个端口。每...

2019-04-17 17:25:50 193

原创 浅谈TCP和UDP的区别

正如我们所知道的,TCP是面向连接,可靠的,字节流服务;而UDP是无连接、不可靠的,数据报服务。接下来进行简单的解释:1、TCP是面向连接的,在进行交互之前必须建立好连接,这如我们打电话一样,在通话之前,必须要进行拨号来建立连接(通过三次握手建立连接和四次挥手来释放连接);而UDP是无连接的,在进行信息交互之前不需要建立连接。所以说,UDP更加的高效。2、TCP是提供可靠的服务,TCP协议通...

2019-04-17 12:53:56 120

原创 C++学习笔记之迭代器

所有的标准库容器都可以使用迭代器,迭代器的主要目的是用来遍历容器的,虽然每个容器的的底层的实现不一样,但对于迭代器来说,对容器的遍历都是一样的,都封装到迭代器的函数中。每个容器都有自己的迭代器的实现,所以在外部开来,操作都是一样的。泛型算法的接受对象都是迭代器。类似于指针,迭代器也提供了对对象的间接访问。通过解引用迭代器,就能访问容器中的元素。迭代器也能从一个元素移动到另一个元素,可以通过重载+...

2019-04-16 01:01:34 289

原创 C++学习笔记之顺序容器

一个容器就是一些特定类型的对象的集合。顺序容器就是为程序员提供了控制元素存储和顺序访问的能力。这种顺序不依赖于元素的值,二是与元素加入容器时的位置控制相对应。顺序容器的类型有**vector:**向量容器①底层实现是一个大小可变的一维数组:按2的次方来扩容(0,1,2,4,8,…)②支持快速访问 ,通过operator[] 来实现随机访问, 时间复杂度为O(1);③通过迭代器来遍历,...

2019-04-15 23:43:05 89

原创 LinuxUDP网络编程

UDP是无连接的,没有TCP中的监听和连接,客户端只要知道服务的地址和端口号就能向其发送消息,不管服务器是否开启,也不能确定服务器是否真的接收到了消息。因为没有了监听和连接,所以必须在发送和接收函数中包含地址和端口号。主要的函数就是recvfrom和sendto,具体函数入下:#include <sys/types.h>#include<sys/socket.h>...

2019-04-09 23:42:07 206

原创 Nginx内存池源码分析

Nginx是轻量级web服务器/反向代理服务器及电子邮件代理服务器。特点是占有内存少,并发能力强。现在主要分析其内存池的实现的原理:Nginx内存池内存池结构有一个的头部,其中包含一个数据部,头部(除数据部)主要是用来为用户分配大块内存(通过链表来实现)、管理外部资源、日志信息等。而数据部而用于分配小块内存,和指向下一个内存池。头部信息结构为:struct ngx_pool_s { ...

2019-04-09 13:48:08 124

原创 C++学习笔记之虚函数

面向对象程序设计的核心思想是数据抽象、继承和动态绑定。通过使用数据抽象,我们可以将类的接口与实现分离;使用继承可以定义相似的类型并对其相似关系建模;使用动态绑定可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。在C++中,通过继承联系在一起的类构成一种层次关系,通常在层次关系的根部有一个基类,其他类直接或间接的从基类继承而来,这些继承来的类称为派生类。基类负责定义在层次关系中所...

2019-04-08 20:35:47 221

原创 LinuxTCP/IP网络编程

通用socket地址#include<bits/socket.h>struct sockaddr{sa_family_t sa_family;char sa_data[14];//因为这是端口号和ip地址共用,不知道哪里是端口号,哪里是ip地址,所以一般不用这个结构体};一般使用专用结构体struct sockaddr_in{sa_family sin_family...

2019-04-08 00:29:25 1221

原创 C++学习笔记之MyString的实现和迭代器

MyString类迭代器的特点:遍历所有容器的方法都是一样的,通过begin和end方法实现class CMyString{public: CMyString(const char*p = nullptr) { if (p != nullptr) { // 1.根据p指向得字符串得长度,开辟一块内存空间 mptr = new char[strlen(p) + 1];...

2019-04-07 11:27:33 125

原创 C++学习笔记之运算符重载

运算符重载运算符重载的意义:运算符的重载,让对象的运算表现得和内置类型一样左边的对象,调用相应运算符的重载函数,把剩下的内容当作实参传递进去运算符重载函数调用优先级:编译器会从1.成员方法找相应得运算符重载函数2.从全局找运算符重载函数重载示例:// 复数类class CComplex{public: //CComplex() CComplex(int) CComplex...

2019-04-07 11:06:24 76

原创 C++学习笔记之模板编程

模板编程函数模板template // 模板参数列表,可以包含多个参数bool compare(const T a, const T b){return a > b;}模板可在编译阶段,调用点进行实例化生成模板函数,在最终一起参与编译形成一个obj文件。但模板不参与编译,如果没有调用模板函数的话,编译器是不会检查模板内的错误的。模板可以有类型参数和非类型参数,非类型参数是一个...

2019-04-07 10:26:01 159

原创 C++学习笔记之面向对象基础

面向对象基础如何理解OOP:说到OOP就不能不说类了,类实际上是对一个实体的抽象化描述,而一个实体包含有属性和行为两种性质,所以类就从这两种性质来描述一个实体;通过将实体的属性转换为成员变量,把行为转换为成员方法;通过类实例化的每一个对象都有自己的独立的成员变量,而共享一套成员方法。这就像每一个人都是不一样的,都是独立的个体,而每个人可能会做同一件事情。而才C++中,通过一个this指针来区别...

2019-04-07 10:10:26 126

转载 MyMiniBash之sleep命令

通过调用sleep函数来实现,主要难点在于将命令中的字符串转换为整型解决方案为使用sscanf函数实现代码:#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<string.h>#include<assert.h>int main(int argc, ...

2019-04-07 00:53:22 132

原创 MyMiniBash之su命令

su 命令用来切换用户su—》表示默认切换到root用户su uer --》表示切换到user用户主体框架通过mybash–fork–》su–fork–》bash1/切换到那个用户2、输入密码3、密码匹配4、fork子进程调用bash,父进程等待子进程结束实现代码:int main(int argc, char *argv[]){ char *user="root";...

2019-04-07 00:39:02 204

原创 MyMiniBash之pwd命令的实现

在linux中,一切皆文件,设备是一种文件,目录也是一种文件,只不过目录文件比较特殊,它里面存储的是一张对应表,保存了文件名和i节点的对应关系表,而i节点才是记录此文件的详细信息的结构,比如文件大小、属性权限、存在硬盘的那个块的等。内核为每一个目录都设置了一个指向自己的i节点入口,即".",还有一个指向其父节点的入口"..",我们先获取当前目录的i节点编号,但不知道当前目录的名称,可以切换到父目...

2019-04-06 14:31:52 153

原创 C++中的多态分析

C++中的多态,可以理解为就是多种形态,也就是对不同的对象发送同一个消息,不同的对象会作出不同的响应;多态分为静态和动态多态静态多态就是在编译阶段就可以确定程序的具体执行,比如函数的重载,模板,使用对象名点访问成员函数等,这些都可以在编译阶段就可以确定下来。其中函数重载就是通过不同的函数符号名来区分调用,模板也是在编译阶段对不同类型,作出不同的实例化,而对象名通过点访问成员函数就是通过thi...

2019-04-06 13:43:58 186

原创 MyMiniBash之clear命令

在linux中clear命令可以刷新整个屏幕,但本质上还是只是让终端向后上翻了一页,滚动屏幕还是可以看到之前的信息。而reset命令将完全刷新整个屏幕,之前的终端输入操作信息都将会清空,具体地clear命令的实现:#include<stdio.h>int main(){ fputs("\x1b[2J\x1b[H",stdout); exit(0);}这些都是VT10...

2019-04-03 15:56:36 217

原创 程序员的自我修养-----第2部分静态链接总结

一、编译和链接编译的四个步骤:1、预处理2、编译3、汇编4、链接预编译预编译过程主要是处理那些源代码文件中的以 “#” 开始的预编译指令,主要规则如下:(1)将有所有的 “#define"删除,并且展开所有的宏定义。(2)处理所有条件预编译指令,比如:”#if"、"#ifdef"、"#elif"、"#endif"、"#else"。(3)处理 “#include” 预编译指令,将...

2019-04-03 01:03:33 237

原创 线程的基本概念

概念:线程是进程内部的一条执行序列(执行流:一组有序的执行流程),一个进程可以有多个线程,至少有一个线程,就是main函数所代表的执行序列-------主线程。线程库创建线程(由一个函数来执行序列)–函数线程;可以说线程是轻量级的进程。进程和线程的区别:1、进程是资源分配的最小单位,线程是CPU调度的最小单位 CPU执行的最小的单位是指令2、一个进程可以有多条线程,但一个线程只能属于一...

2019-03-29 13:27:18 92

空空如也

空空如也

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

TA关注的人

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