- 博客(47)
- 收藏
- 关注
原创 Git的使用
是采用的同步机制,即本地的代码版本和服务器的版本保持一致(提交版本时,直接 提交到服务器), 而git是采用异步机制(分为本地仓库和远程仓库),本地提交的版本不会影响服务器 的版本,只有本地的代码上传到服务器时才会同步。将当前目录下的文件添加到暂存区中,如果文件没有添加到暂存区时,显示的状态应该是红色的,添加到暂存区之后,显示状态的颜色应该是绿色的。如果在当前分支下创建的新的分支存在新的提交版本,则需要切换到当前分支下,可以将新的分支合并 到当前分支。在当前分支下(最新的版本号)创建一个新的分支。
2023-12-26 20:12:10
1056
原创 Linux高级系统编程-MySQL,使用C语言操作MySQL
完成对结果集的操作后,必须调用mysql_free_result()通过检查mysql_store_result()在mysql_store_result()mysql_real_connect()尝试与运行在主机上的。,但是如果在任何 情况下均调用 了mysql_store_result()如果句柄是由mysql_init()对于其他查询,不需要调用mysql_store_result()之后使用时,如果没有要检索的 行,mysql_fetch_row()释放由mysql_store_result()
2023-12-18 21:14:31
1628
1
原创 Linux高级系统编程- mysql数据库安装及环境配置
SQL()结构化查询语言,用于存取、查询、更新数据以 及管理关系型数据库系统SQL是在1981年由IBM公司推出,一经推出基于其简洁的语法在数据库中得到了广泛的 应用,成为主流数据库的通用规范SQL由ANSI组织确定规范 在不同的数据库产品中遵守SQL的通用规范,但是也对SQL有一些不同的改进,形成了一 些数据库的专有指令MySQLlimitSQLServertopOraclerownum分类根据SQL指令完成的数据库操作的不同,可以将SQL指令分为四类。
2023-12-16 16:34:03
1264
原创 Liunx高级系统设计9-线程间同步与互斥
用于销毁一个读写锁,并释放所有相关联的资源(所谓的所有指的是pthread_rwlock_init() 自动申请的资源)3)对互斥锁进行加锁后,任何其他试图再次对互斥锁加锁的线程将会被阻塞,直到锁被释放。函数返回时, 解除阻塞并重新申请获取互斥锁pthread_mutex_lock(&mutex);如果没有写者持有该锁,并且没有写者阻塞在该锁上,则调用线程会获取读锁。如果没有写者持有该锁,并且没有写者读者持有该锁,则调用线程会获取写锁。对互斥锁上锁,若互斥锁已经上锁,则调用者阻塞,直到互斥锁解锁后再上锁。
2023-12-13 19:55:27
973
原创 Linux高级系统编程-线程
使调用线程与当前进程分离,分离后不代表此线程不依赖与当前进程,线程分离的目的 是将线程资源的回收工作交由系统自动来完成,也就是说当被分离的线程结束之后,系统会自动回收它的资源。Linux 下线程的属性是可以根据实际项目需要,进行设置,之前我们讨论的线程都是采 用线程的默认属性,默认属性已经可以解决绝大多数开发时遇到的问题。如我们对程序的性能提出更高的要求那么需要设置线程属性,比如可以通过设置线程栈的大小来降低内存的使用,增加最大线程个数。下,线程最是小的执行单位;线程的取消并不是实时的,而又一定的延时。
2023-12-12 19:43:47
1032
原创 Linux高级系统编程- 消息队列 与 内存共享
这样造成 读文件时需要先将文件页从磁盘拷贝到页缓存中,由于页缓存处在内核空间,不能被用 户进程直接寻址,所以还需要将页缓存中数据页再次拷贝到内存对应的用户空间中。而之后访问数据时发现内存中并无数据而发起的缺 页异常过程,可以通过已经建立好的映射关系,只使用一次数据拷贝,就从磁盘中将数 据传入内存的用户空间中,供进程使用。在内核空间不能直接访问,必须要先拷贝至内核空间对应的主存, 再写回磁盘中(延迟写回),也是需要两次数据拷贝。6、每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的。
2023-12-11 20:03:00
1144
原创 C++STL库的 deque、stack、queue、list、set/multiset、map/multimap
Deque 最大的工作就是维护这些分段连续的内存空间的整体性的假象,并提供随 机存取的接口,避开了重新配置空间,复制,释放的轮回,代价就是复杂的迭代器架构。拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作 时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。某些相同的性质,当对容器中的元素进行插入操作或者删除操作的 时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。对于空间的运用有绝对的精准,一点也不浪费。
2023-12-09 17:27:23
1661
原创 Linux高级系统编程 - 5 管道
无名管道与有名管道的使用场景1,无名管道应用与有血缘关系的进程中2,有名管道应用与没有血缘关系的进程中无名管道与有名管道的区别1,无名管道基于内存无需文件管理系统2,有名管道基于文件和内存需要文件管理系统dup2作用:复制文件描述意义:可以实现文件的重定向。
2023-12-08 17:44:50
1052
原创 LInux高级系统编程-4 信号
所需头文件函数//将set集合置空//将所有信号加入set集合//将signo信号加入到set 集合//从set集合中移除signo 信号//判断信号是否存在于 集合中。
2023-12-07 20:16:45
1320
原创 Linux高级系统编程中的系统调用
是整个计算机系统,操作系统内核、及其其他所有正在运 行的程序,都会因为你操作失误而受到不可挽回的错误,那么你只有重启整个计算机才 行 而对于 硬件的操作 是非常复杂的,参数众多,出问题的几率相当大,必须及其谨 慎的进行操作,这对于个人开发者来说是个艰巨的任务,同时个人开发者在这方面也是 不被信任的。,其内部封 装的是内核中的系统函数open() 因为这个需求,硬件设备商直接提供了硬件级别的支持,做法就是对 CPU。系统调用是需要时间的,程序中频繁的使用系统调用会降低程序的运行效率。
2023-12-05 20:28:43
1166
原创 Liunx高级程序设计-Shell -1
如果有,直接进入,提示请输入一个字符串,并按此字符串创建一个文件,如果此。这类脚本无需用户调用,系统会在合适的时候调用,如:/etc/profile。``:反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量。"$$"变量最常见的用途是用作临时文件的名字以保证临时文件不会重复。文件已存在,提示重新输入,重复三次自动退出,不存在创建完毕,退出。这个文件一般设置与个人用户有关的环境变量,如交叉编译器的路径等等。无论是系统调用的还是需要我们自己调用的,其语法规则都一样。
2023-12-04 20:25:04
877
原创 C++STL中的string容器
都会返回字符的引用。//创建一个空的字符串 例如。u String 封装了很多实用的成员方法。比较区分大小写,比较时参考字典顺序,排越前面的越小。太过复杂难于掌握,不适合大程序的开发, 所以 C++u Char*是一个指针,类负责维护,不用担心复制越界和取值越界等。是一个类 string 封装了 char。//string 转。的隐式类型转换,却不存在从一个。
2023-12-03 17:49:23
946
原创 C++中的STL库中,容器vector的使用
是静态空间,一旦配置了就不能改变,要换大一点或者小一 点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的 数据搬往新空间,再释放原来的空间。Vector 维护一个线性空间,所以不论元素的型别如何,普通指针都可以作为 vector 的迭代器,因为。的运用对于内存的合理利 用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个 大块头的 array。的容量永 远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,整个 vector 容器就得另觅居所。
2023-12-01 21:23:28
1284
原创 C++中的类型转换和异常
c++异常处理使得异常的引发和异常的处理不必在一个函数中,这样底层的函数可 以着重解决具体问题,而不必过多的考虑异常的处理。),要认识到的一个思想: 在异常处理过程中,由问题检测代码可以抛出一个对象给问题处理代码,通过这个 对象的类型和内容,实际上完成了两个部分的通信,通信的内容是“还有一个缺点就是函数的返回值只有一个,你通过函数的返回值表示错误代码, 那么函数就不能返回其他的值。转换是非常有用的,但是它也会带来一些问题,比如在转换指针时,我们很可能将其转换成一个比它更大的类型,但这可能会破坏其他的数据。
2023-11-29 17:36:46
1301
原创 C++中的模板
所谓函数模板,实际上是建立一个通用函 数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在 调用的地方对参数替换后的 代码进行编译。如果是结构体,该假设也不成立, 另外如果是传入的数组,数组名为地址,因此它比较的是地址,而这也不是我们所 希望的操作。总之,编写的模板函数很可能无法处理某些类型,另一方面,有时候通用化是有 意义的,但 C++为了解决这种问题,可以提供模板的重载,为这些特定的类型提供具体化的模板。
2023-11-28 20:37:10
1313
原创 C++中类的静态成员、存储、this、友元和运算符重载
调用代码时候,要优先使用前缀形式,除非确实需要后缀形式返回的原值,前缀和 后缀形式语义上是等价的,输入工作量也相当,只是效率经常会略高一些,由于前 缀形式少创建了一个临时对象。实现封装的一种机制,它将对象和该对象调用的成员函数连接在 一起,在外部看来,每一个对象都拥有自己的函数成员。的,所有来的客人都 可以进去,但是你的卧室是私有的,也就是说只有你能进去,但是呢,你也可以允 许你的闺蜜好基友进去。意味着它不是这个类的成员函数,却可以修改这个类 的私有成员,而且必须列在类的定义中,因此他是一个特权函数。
2023-11-27 18:02:41
1350
原创 C++中的类与对象
当我们创建数组的时候,总是需要提前预定数组的长度,然后编译器分配预定长度的数组空间,在使用数组的时,会有这样的问题,数组也许空间太大了,浪费空间,也许空间不足,所以对于数组来讲,如果能根据需要来分配空间大小再好不过。对象,就会省去一个拷贝构造和一个析构函数的开销,在 程序中一个对象的拷贝也是非常耗时的,如果减少这种拷贝和析构的次数,那么从另一个角度来说,也是编译器对程序执行效率上进行了优化。同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然 是独立的两个对象,这种情况被称为浅拷贝.
2023-11-24 17:50:23
910
原创 C++对C的扩展
当调用一个内联函数的时候,编译器首先确保传入参数类型是正确匹配的,或者如 果类型不正完全匹配,但是可以将其转换为正确类型,并且返回值在目标表达式里 匹配正确类型,或者可以转换为目标类型,内联函数就会直接替换函数调用,这就 消除了函数调用的开销。中,预定义宏的概念是用内联函数来实现的,而内联函数本身也是一个真正 的函数。一个好的编译器将会 内联小的、简单的函数。内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那 样,可以进行参数,返回值类型的安全检查,又可以作为成员函数。
2023-11-23 20:30:36
1139
原创 C++中类的多态
这就是说,仅想对基类进 行向上类型转换,使用它的接口,而不希望用户实际的创建一个基类的对象。当编译器发现我们的类中有虚函数的时候, 编译器会创建一张虚函数表,把虚函数的函数入口地址放到虚函数表中,并且在类 中秘密增加一个指针,这个指针就是 vpointer(C++动态多态性是通过虚函数来实现的,虚函数允许子类(派生类)重新定义父类 (基类)成员函数,而子类(派生类)重新定义父类(基类)虚函数的做法称为覆 盖(override)在对象构建的时候,也就是在对象初始化调用构造函数的时候。,就是说地址是早绑定的。
2023-11-22 16:53:27
146
原创 C++中类的继承
虚继承只能解决具备公共祖先的多继承所带来的二义性问题,不能解决没有公共 祖先的多继承的. 工程开发中真正意义上的多继承是几乎不被使用,因为多重继承带来的代码复杂性 远多于其带来的便利,多重继承对代码维护性上的影响是灾难性的,在设计方法上, 任何多继承都可以用单继承代替。派生类继承基类,派生类拥有基类中全部成员变量和成员方法(除了构造和析构之 外的成员方法),但是在派生类中,继承的成员并不一定能直接访问,不同的继承 方式会导致不同的访问权限。我们可以从一个类继承,我们也可以能同时从多个类继承,这就是多继承。
2023-11-21 17:33:31
136
原创 C++中面向对象思想的封装性
假如某对象的某项属性不想被外界获知,比如说漂亮女孩的年龄不想被其他人知道,假如某对象的某项属性不想被外界获知,比如说漂亮女孩的年龄不想被其他人知道,是每个事物都具有自身的属性,一些自身具有的行为,所以如果我们能把事物的属。定义一个结构体用来表示一个对象所包含的属性,函数用来表示一个对象所具有的。那么年龄这条属性应该作为女孩自己知道的属性;所以说封装特性包含两个方面,一个是属性和变量合成一个整体,一个是给属性和。定义一个结构体用来表示一个对象所包含的属性,函数用来表示一个对象所具有的。如果我们让所有的成员。
2023-11-20 16:35:17
125
原创 C语言中的结构体、位于(位段)、共用体、枚举
1、概念:结构体是一种构造类型的数据结构,是一种或多种基本类型或构造类型的数据的集合。2、 结构体类型的定义方法咱们在使用结构体之前必须先有类型,然后用类型定义数据结构这个类型相当于一个模具(1).先定义结构体类型,再去定义结构体变量struct 结构体类型名{成员列表。
2023-11-07 20:56:19
108
原创 C语言中的字符串处理函数
是个库函数,它测的是字符指针指向的字符串中字符的个数,不管指针是数组的名字,还是个指针变量。字符串切割,按照 delim 指向的字符串中的字符,切割。测字符指针 s 指向的字符串中字符的个数,不包括。验证了追加字符串的时候追加’\0’如果测量的是数组的名字,则测的是数组占多少个字节。测的是指针变量,则测的是指针变量本身占几个字节,找到了返回找到的字符的地址,找到了:找到的字符串的首地址。是个关键字,测量数据的占用内存空间大小。追加的时候会追加’\0’只切割一次,切割一次之后,再去切割的时候。
2023-11-06 19:38:50
111
原创 C语言中的内存分配与内存泄漏
1、在程序编译或运行过程中,按事先规定大小分配内存空间的分配方式。申请的内存,首地址丢了,找不了,再也没法使用了,也没法释放了,这块内存就被泄 露了。4,malloc从堆区申请空间后 空间的内容中的值是随机的。语言中提供了一系列动态分配内存的函数 这些函数大部分都在stdlib.h。1、在程序运行过程中,根据需要大小自由分配所需空间。3、分配在栈区或全局变量区,一般以数组的形式。3、分配在堆区,一般使用特定的函数进行分配。2、必须事先知道所需空间的大小。
2023-11-03 21:16:43
193
原创 C语言中的“指针” 合集,全网最全的指针学习文档,指针搞不明白就来看看吧!
语法:数据类型 变量名指针的类型char * 存储字符型数据的地址编号的数据类型 字符指针short * 存储short型数据的地址编号的数据类型 短整形指针int * 存储int型数据的地址编号的数据类型 整形指针long * 存储long型数据的地址编号的数据类型 长整形指针float * 存储float型数据的地址编号的数据类型 单精度浮点型指针double * 存储double型数据的地址编号的数据类型 双精度浮点型指针...如://案例。
2023-11-02 17:09:01
127
原创 C语言中的数组
这样就更麻烦了,所以我们需要用到一个东西用来存放多数据的容器,那么数组就应运而生。其实传递的是数组名对应的地址此时当函数中将该数组中的内容修改,元素在数组中的位置,下标从。数组中可存储元素个数。x:二维数组中存储的一维数组的个数。数组中的数据在内存中有序存储的,y:一维数组中可存储的元素的个数。1,获取二维数组中一维数组的个数。4,在循环内遍历获取到的一维数组。因为数组不能修改其指向的地址(将一维数组作为元素存储的数组。2,获取一维数组中元素的个数。那么调用该函数所传递的数组的值也将被修改。
2023-11-01 20:25:35
88
原创 Linux系统安装与创建虚拟机,以及安装samba和openssh插件
下载软件下载软件VMwareUBuntu镜像vmtools镜像安装VMware一直下一步注意安装的路径最好不要在c盘使用VMware创建虚拟机注意命名虚拟机时位置中不要有中文虚拟机设置将弹出以下界面。
2023-10-24 21:28:21
231
原创 使用layui实现模拟考试页面,完成做题,得分,错题详解等功能
相信大家疫情期间都有线上考试的 经历,我自己对这个很感兴趣,就模拟考试做了一个页面先给大家看看效果图吧这是没有具体题目的一个模拟页面,有具体题目的页面在后面下面这个是完整的换一种风格的模拟页面。
2023-10-18 21:42:20
994
4
原创 vue的生命周期及生命周期钩子函数
6. mounted 挂载完成阶段,此时页面是经过vue解析的dom,至此初始化过程结束,可以在这里进行:开启定时器,发送请求,绑定自定义事件等初始化操作,在这里也可以对dom进行操作,但尽量避免这样操作。9. beforeDestroy阶段,销毁之前,此时wm中所有的data,methods,指令等等都处于可用状态,马上要执行销毁过程,一般在此阶段,关闭定时器,取消订阅消息,解除自定义绑定事件等收尾工作。然后,根据新数据,生成新的虚拟dom,最后与旧的dom进行比较,完成页面更新。
2023-10-17 20:32:42
48
原创 使用原生js和layui动态创建一个数据表格,实现简单增删改查功能
动态创建表格,先在html里面写入表头thead里的内容,然后写一个空的tbody。接下来使用js来读取数据,并创建表格,我们使用双重循环来遍历数组中存储的对象,并创建tr 和td加以赋值这样已知数据的表格已经生成,接下来我们加入添加按钮,加入三个input框,用于取用户输入的值。根据以上办法可以做到动态数据表格。但是代码太过繁琐,所以,在学习了layui之后我们使用layui来制作数据表格。相比原生js来说,layui则比较便捷,只需要在html里创建一个容器,写一行table代码即可。
2023-10-17 20:21:20
1542
原创 只使用js对数据生成表单
要想根据数据来生成,我们不妨利用数组和对象的特性,将数据根据键值对存在对象中在将其放在数组中。用循环将数组遍历,有多少数据,就循环多少次,并且随之创建和追加元素。然后根据数组的索引值再和每次创建追加的元素进行对应,键对应input的名称,值对应input框里的值,这个时候我们就已经完成了。这里我们使用了document.createElement("input")来创建input元素,然后将input追加上去$("form").append(input)。这样我们就追加了一条表单元素。
2023-10-17 20:09:56
96
原创 vue中的计算属性与监视属性的区别
computed和watch之间的区别:computed能完成的功能,watch都可以完成。watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。两个重要的小原则:所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm 或 组件实例对象。所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等、Promise的回调函数),最好写成箭头函数,这样this的指向才是vm 或 组件实例对象。
2023-10-14 16:45:46
144
1
原创 理解Vue的MVVM模型的实现
MVVM 本质上是 MVC (Model-View- Controller)的改进版。视图模型viewModel是 mvvm 模式的核心,它是连接 view 和 model 的桥梁。将视图转化成模型,即将所看到的页面转化成后端的数据。视图(View) :模板代码(不是静态页面) (两个语法:指令,大括号表达式)将模型转化成视图,即将后端传递的数据转化成所看到的页面。实现的方式是:数据绑定。模型model指的是后端传递的数据,视图view指的是所看到的页面。这两个方向都实现的,我们称之为数据的双向绑定。
2023-10-14 16:37:51
44
1
原创 js中的文档碎片
我们知道,当我们在操作DOM的时候,是一个很耗性能的过程,尤其是改变DOM的结构就更加的消耗性能,但是有些时候我们不得不在DOM中添加内容,改变DOM的结构,此时我们就要减少DOM结构改变时的性能消耗,怎么减少性能消耗呢,这时我们就要引用“文档碎片”,其目的就是将我们每次增加的节点先存储在文档碎片中,在将文档碎片再添加到DOM结构中,这样将多次增加节点改变DOM结构,变了只改变一次DOM结构,大大得减少了性能的消耗。文档碎片:(操作1次dom)1、我们要明白当js操作dom时发生了什么?
2023-10-14 16:35:33
321
1
原创 js中的事件循环机制
所有的任务可以分为同步任务和异步任务,同步任务,顾名思义,就是立即执行的任务,同步任务一般会直接进入到主线程中执行;什么是 microtasks?规范中规定,task分为两大类, 分别是 Macro Task (宏任务)和 Micro Task(微任务), 并且每个宏任务结束后, 都要清空所有的微任务,这里的 Macro Task也是我们常说的 task ,有些文章并没有对其做区分,后面文章中所提及的task皆看做宏任务( macro task)。来自不同任务源的任务会进入到不同的任务队列。
2023-10-14 16:28:57
28
1
原创 js中的栈和堆以及 js的内存模型
值类型:数字number , 布尔 Boolean, 字符串string, 空null , 未定义的undefined引用数据类型: 数组array , 对象 object , 函数function区别:基本数据类型就是简单的数据段,引用数据类型是指由多个值构成的对象。基本数据类型是按值访问,因为可以直接操作保存在变量中的实际值。存储在栈中。引用类型是保存在堆内存中的对象,无法直接访问,只能通过操作对象在栈中的内存地址去调用。
2023-10-14 16:23:18
183
1
原创 c++中的变量存储
作用范围:当前源文件以及其他源文件都可以识别。、全局变量和局部变量同名 优先选择局部变量。、静态全局变量 不初始化 内容为。是程序从开始到结束的一个过程。、如果使用其他源文件的全局变量。、静态局部变量如果遇到重复定义。作用范围:只能在当前源文件使用。、全局变量 不初始化 内容为。、静态局部变量不初始化内容为。、局部变量不初始化内容随机。每个进程都对应一个空间。结束,局部变量就释放。、只能在当前源文件使用。
2023-10-14 16:09:17
56
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人