![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 62
杰弗瑞同学
在读研究生,专业搬砖,欢迎交流!
展开
-
protobuf的安装与使用
protobuf的安装windows 平台 (vs2017)安装protobuf下载protobuf的C++版本的源代码,地址:https://github.com/google/protobuf/releases下载 protobuf-cpp-3.8.0.zip/tar.gz 这个包解压源码 (路径不要带中文)安装cmake,下载地址:https://cmake.org/download/使用cmake 生成 vs2017 工程进入 vs2017 工程目原创 2022-03-19 14:13:34 · 853 阅读 · 0 评论 -
Git的学习与总结
git介绍集中式版本控制系统集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,那就GG了.分布式版本控制系统分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上原创 2022-03-18 15:33:45 · 285 阅读 · 0 评论 -
OpenSSL的部署与使用
数据加密加密三要素:明文/密文明文 -> 原始数据密文 -> 加密之后的数据秘钥定长的字符串对称加密 ->自己生成非对称加密 -> 有对应的算法可以直接生成算法加密算法解密算法常用加密方式对称加密秘钥比较短秘钥只有一个加密解密使用的秘钥是相同的加密的效率高加密强度相对较低( 相对于非对称加密 )秘钥分发困难 -> 因为秘钥要保密不能泄露秘钥不能直接在网络环境中进行发送非对称加密秘钥比较长原创 2022-03-17 16:32:24 · 5545 阅读 · 0 评论 -
Shell学习与总结(2)
Shell函数位置参数和特殊变量$0 相当于C语言main函数的argv[0]$1、$2... 这些称为位置参数(Positional Parameter),相当于C语言main函数的argv[1]、argv[2]...$# 相当于C语言main函数的argc - 1,注意这里的#后面不表示注释$@ 表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。$* 表示参数列表"$1" "$2" ...,同上$? 上一条命令的Exit Status原创 2022-03-16 17:22:22 · 820 阅读 · 0 评论 -
Shell学习与总结(1)
ShellShell的作用是解释执行用户的命令,用户输入一条命令,Shell就解释执行一条,这种方式称为交互式(Interactive),Shell还有一种执行命令的方式称为批处理(Batch),用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。Shell脚本和编程语言很相似,也有变量和流程控制语句,但Shell脚本是解释执行的,不需要编译,Shell程序从脚本中一行一行读取并执行这些命令,相当于一个用户把脚本中的命令一行一行敲到Sh原创 2022-03-15 14:34:16 · 1879 阅读 · 0 评论 -
Linux网络学习与总结(7)
网络服务器http超文本传输协议http协议对消息区分可以分为请求消息和响应消息.我们要开发的服务器与浏览器通信采用的就是http协议,在浏览器想访问一个资源的时候,在浏览器输入访问地址(例如http://127.0.0.1:8000),地址输入完成后当敲击回车键的时候,浏览器就将请求消息发送给服务器。我们可以先用测试工具创建一个socket服务器之后通过浏览器请求地址,就会看到浏览器发送过来的请求消息请求消息分为四部分内容:请求行 说明请求类型,要访问的资源,以及使用的http版本请求原创 2022-03-14 14:34:04 · 773 阅读 · 0 评论 -
Linux网络学习与总结(6)
libevent网络的事件库跨平台,支持多种多路io复用核心: 以事件驱动(触发),回调安装libevent解压 : tar -xzvf libevent-2.0.22-stable.tar.gz -C ./install执行configure ,检测环境生成makefile ./configure编译 sudo make安装 sudo make install库的路径: /usr/local/lib头文件目录: /usr/local/include'编译时需要指定库名 -lev原创 2022-03-14 00:34:12 · 641 阅读 · 0 评论 -
Linux网络学习与总结(5)
UDP通信UDP与TCPTCP:传输控制协议 安全可靠 丢包重传 面向连接(电话)UDP:用户数据报协议 不安全不可靠 丢包不重传 快 不面向连接(邮件)TCP通信:服务端:创建流式套接字 绑定 监听 提取 读写 关闭客户端:创建流式套接字 连接 读写 关闭收发数据:read : recvssize_t recv(int sockfd, void *buf, size_t len, int flags);//flags==MSG_PEEK 读数据不会删除缓冲区的数据write : s原创 2022-03-13 21:44:28 · 654 阅读 · 0 评论 -
Linux网络学习与总结(4)
epoll用法详解poll相对与select的优缺点优点:没有文件描述符1024的限制请求和返回是分离的缺点和select一样:每次都需要将需要监听的文件描述符从应用层拷贝到内核每次都需要将数组中的元素遍历一遍才知道那个变化了大量并发,少量活跃效率低查询一个进程能够打开socket最大的文件描述符:cat /proc/sys/fs/file-max通过修改配置文件修改上限:sudo vi /etc/security/limits.confpollpoll使用的是数组,select原创 2022-03-13 15:41:58 · 1013 阅读 · 0 评论 -
Linux网络学习与总结(3)
高并发服务器多路IO转接(多路IO复用): 内核监听多个文件描述符的属性(读写缓冲区)变化如果某个文件描述符的读缓冲区变化了,这个时候就是可以读了,将这个事件告知应用层select监听文件描述符的存储空间变化#include <sys/select.h> /* According to earlier standards */ #include <sys/time.h> #include <sys/types.h> #原创 2022-03-13 13:04:48 · 344 阅读 · 0 评论 -
Linux网络学习与总结(2)
线程间socket通信main函数中参数argc和argv含义及用法argc 是 argument count的缩写,表示传入main函数的参数个数;argv 是 argument vector的缩写,表示传入main函数的参数序列或指针,并且第一个参数argv[0]一定是程序的名称,并且包含了程序所在的完整路径,所以确切的说需要我们输入的main函数的参数个数应该是argc-1个;argv是指向指针的指针,main函数的第二个参数“char *argv[]“也可以替换为 “char **argv“原创 2022-03-13 11:15:14 · 4184 阅读 · 0 评论 -
Linux网络学习与总结(1)
网络通信编程物理地址是标识适配器(网卡)的ID,六个字节,48位,全球唯一不会改变。作用是收发数据。IP地址是用来表示一台主机的逻辑地址。IPV4:4个字节,32位,用在局域网IPV6:16字节,128位,用在广域网IP将其分为子网ID和主机ID子网ID:IP中被子网掩码中1连续覆盖的位主机ID:IP中被子网掩码中0连续覆盖的位比如:IP:192.168.1.2/24(24代表连续24个1,即255.255.255.0)子网id:192.168.1主机id:2网段地址:192.16原创 2022-03-13 09:20:46 · 336 阅读 · 0 评论 -
Linux学习与总结(8)
互斥锁互斥:是指散步在不同任务之间的若干程序片断,当某个任务运行其中一个程序片段时,其它任务就不能运行它们之中的任一程序片段,只能等到该任务运行完这个程序片段后才可以运行。最基本的场景就是:一个公共资源同一时刻只能被一个进程或线程使用,多个进程或线程不能同时使用公共资源。同步:是指散步在不同任务之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。最基本的场景就是:两个或两个以上的进程或线程在运行过程中协同步调,按预定的先后次序运行。比如 A 任务原创 2022-03-11 18:53:14 · 487 阅读 · 0 评论 -
Linux学习与总结(7)
多线程线程是真正的执行实体,在Linux底层,深拷贝是一个进程,浅拷贝是一个线程。线程是轻量级的进程(LWP:light weight process),在Linux环境下线程的本质仍是进程。为了让进程完成一定的工作,进程必须至少包含一个线程。进程,直观点说,保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源,所以我们也说,进程是CPU分配资源的最小单位。线程存在与进程当中(进程可以原创 2022-03-11 15:53:24 · 109 阅读 · 0 评论 -
Linux学习与总结(6)
守护进程查看shell当前正在处理的作业jobs将后台作业移到前台fg 将一个在后台暂停的命令,变成继续执行bg查看终端tty进程组进程组,也称之为作业。BSD于1980年前后向Unix中增加的一个新特性。代表一个或多个进程的集合。每个进程都属于一个进程组。在waitpid函数和kill函数的参数中都曾使用到。操作系统设计的进程组的概念,是为了简化对多个进程的管理。当父进程,创建子进程的时候,默认子进程与父进程属于同一进程组。进程组ID为第一个进程ID(组长进程)。所以,组原创 2022-03-11 14:00:29 · 106 阅读 · 0 评论 -
Linux学习与总结(5)
进程通信信号信号是软件中断,它是在软件层次上对中断机制的一种模拟,是一种异步通信的方式 。信号可以导致一个正在运行的进程被另一个正在运行的异步进程中断,转而处理某一个突发事件。信号的特点简单不能携带大量信息满足某个特设条件才发送信号可以直接进行用户空间进程和内核空间进程的交互,内核进程可以利用它来通知用户空间进程发生了哪些系统事件。一个完整的信号周期包括三个部分:信号的产生,信号在进程中的注册,信号在进程中的注销,执行信号处理函数。Linux 可使用命令:kill -l(“l” 为字原创 2022-03-11 10:20:35 · 542 阅读 · 0 评论 -
Linux学习与总结(4)
进程通信无名管道半双工,数据在同一时刻只能在一个方向上流动。数据只能从管道的一端写入,从另一端读出。写入管道中的数据遵循先入先出的规则。管道所传送的数据是无格式的,这要求管道的读出方与写入方必须事先约定好数据的格式,如多少字节算一个消息等。管道不是普通的文件,不属于某个文件系统,其只存在于内存中。管道在内存中对应一个缓冲区。不同的系统其大小不一定相同,管道大小=缓冲区大小。从管道读数据是一次性操作,数据一旦被读走,它就从管道中被抛弃,释放空间以便写更多的数据。管道没有名字,只能在具有公原创 2022-03-10 23:10:30 · 131 阅读 · 0 评论 -
Linux学习与总结(3)
系统IO虚拟地址空间每个进程都会分配虚拟地址空间,在32位机器上,该地址空间为4G(2^32=4G)在进程里平时所说的指针变量,保存的就是虚拟地址。当应用程序使用虚拟地址访问内存时,处理器(CPU)会将其转化成物理地址(MMU)。MMU:将虚拟的地址转化为物理地址。这样做的好处在于:进程隔离,更好的保护系统安全运行屏蔽物理差异带来的麻烦,方便操作系统和编译器安排进程地址0-3G:用户区3-4G:内核区段错误:内存访问非法,访问内核区。.text:代码段,转化为二进制代码.data:原创 2022-03-10 21:09:09 · 408 阅读 · 0 评论 -
Linux学习与记录(2)
程序与进程程序是存放在介质上的一个可执行文件。进程是程序执行的过程,是动态变化的,是管理事务的基本单元。在计算机中时间中断是多道程序设计的理论基础(时间片轮转法),分时复用CPU资源。并行:同一时刻多条指令再多个处理上同时执行。并发:同一时刻只能有一条指令执行,但多个进程指令被快速的轮转执行。MMU:内存管理单元。CPU管理虚拟存储器、物理存储器的控制线路,负责虚拟地址映射为五哦里地址。提供硬件机制的内存访问授权。PCB:进程控制块。进程运行时,内核为进程的每一个进程分配一个PCB,维护进程相原创 2022-03-10 17:47:15 · 205 阅读 · 0 评论 -
Linux 学习与总结(1)
库文件静态库:在程序的链接阶段被复制到程序中动态库:在运行时由系统动态加载到内存中库的好处:代码保密,方便保存分发静态库:命名规则:Linux:libxxx.alib:前缀xxx:库名字.a:后缀ar工具(archive)ar rcs linxxx.a xxx.o xxx.or - 文件插入备存文件c - 建立备存文件s - 建立索引动态库:命名规则Linux:linxxx.so制作:gcc -c -fpic a.c b.cgcc -shared a.o b.o原创 2022-03-10 14:12:25 · 638 阅读 · 0 评论 -
c++ 内存管理(3)allocator的设计与应用
本文根据《侯捷–c++内存管理》一课进行学习总结:allocator的演变第一个版本是我们自己在类里面进行内存申请,先申请一大块chunk大小的内存空间,再用链表将chunk中切成块,每一块是一个screenChunk=24的大小,用linked list的方式进行连接。第二个版本和第一个版本类似,区别就是使用了union,并用一个*next作为头指针(指向第二块作为开始)。第三个版本,将内存分配封装起来,由allocator统一分配处理。// 第三个版本class alloc原创 2021-11-29 16:09:09 · 541 阅读 · 0 评论 -
const常量的用法与易错点分析
本文通过对c++ primer的总结以及个人理解,总结成一篇博客帮助自己复习。1.常量的使用:我们定义一种变量,它的值不能被改变,可以使用关键字const对变量的类型进行限定。我们举个栗子://i正确,j错误,k正确, c正确。//i,c正确初始化,j没有初始化,k是一个未经初始化的常量,一旦运行函数将被初始化。const int i = 1;const int j;const int k = get_size();const int c = i;在多个文件共享const对象时,可以使原创 2021-10-17 15:32:58 · 471 阅读 · 0 评论 -
c++ 内存管理(2)new、delete的重载
本文根据《侯捷–c++内存管理》一课进行学习总结:c++内存分配途径Foo* p = new Foo(x);delete p;//相当于:Foo* p = (Foo*)operator new(sizeof(Foo));new(p) Foo(x);p->~Foo();operator delete(p);// 相当于:Foo* p = (Foo*)malloc(sizeof(Foo));new(p) Foo(x);p->~Foo();free(p);//原创 2021-11-29 14:18:13 · 686 阅读 · 0 评论 -
c++ 内存管理(1)new、delete的内存申请与删除操作
本文根据《侯捷–c++内存管理》一课进行学习总结:c++ memory primitives// 一般使用的形式void* p1 = malloc(512); // 512bytesfree(p1);complex<int>* p2 = new complex<int>;delete p2;void* p3 = ::operator new(512);::operator delete(p3);// GNUC下可以使用的形式#ifdef __GNUC__原创 2021-11-28 16:55:33 · 466 阅读 · 0 评论 -
默认构造函数,拷贝构造函数,移动构造函数实例
直接上例子,更能清楚的显示区别:(例子参考自c++ primer 5th 课后题)例子1:#include<iostream>#include<vector>using namespace std;struct X { X() { std::cout << "X()" << std::endl; } X(const X&) { std::cout << "X(const X&)" << std原创 2021-11-26 21:41:13 · 290 阅读 · 0 评论 -
Leetcode 题目解法分享(92. 反转链表 II,剑指 Offer 24. 反转链表)
2023级毕业生,求职不易,愿大家都有一个更好的明天。接下来我会分享我在leetcode做的一些有趣的题,欢迎大家交流!反转链表 II给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-linked-list-ii示例 1:输入:hea原创 2021-11-24 23:04:46 · 322 阅读 · 0 评论 -
effective c++条款总结(7)
认识模板元编程(TMP)// 利用TMP在编译器计算阶乘template<unsigned n>struct Factorial{ enum { value = n * Factorial<n-1>::value };}template<>struct Factorial<0>{ enum { value = 1 };}// 测试函数int main(){ std::cout << Factorial<5>:.原创 2021-11-22 15:06:27 · 647 阅读 · 0 评论 -
effective c++条款总结(6)
使用成员函数模板生成可接受所有兼容类型的函数。// SmartPtr<T>拥有了拷贝构造函数,这个构造函数只有在实参适合(兼容/隐式转换)的时候才能通过编译template<typename T>class SmartPtr{public: template<typename U> SmartPtr(const SmartPtr<U>& other) : heldPtr(other.get()){...} T* get() const.原创 2021-11-22 10:57:51 · 626 阅读 · 0 评论 -
effective c++条款总结(5)
声明template参数是,template< class >和template< typename >是等价的。但有例外:template<typename C>// const C& c 不需要加typenamevoid f(const C& c){// 嵌套从属类型名称,我们需要放置关键字typename// 为了告诉c++编译器C::const_iterator是个类型,缺省的话会被定为为非类型 typename C::const.原创 2021-11-21 17:47:22 · 311 阅读 · 0 评论 -
实现函数指针的功能,tr1::bind,tr1::function,virtual函数重载
直接上例子,参考Effective c++ 和 https://blog.csdn.net/chdhust/article/details/8006601#include <iostream>#include <iomanip>#include <tr1/memory>#include <tr1/functional>//std::tr1::function 可以对静态成员函数进行绑定//std::tr1::bind 可以对非静态成员函数进行绑原创 2021-11-21 14:42:09 · 280 阅读 · 0 评论 -
effective c++条款总结(4)
不要重新定义继承而来的非virtual函数。不要重新定义继承而来的缺省参数值。// 让非virtual函数指定缺省参数,而private virtual函数负责工作。class Base{public: enum BaseType{ A, B, C}; void show(BaseType type = A) const{ doShow(type); }private: virtual void doShow(BaseType type) const = 0;}class D.原创 2021-11-21 14:26:00 · 90 阅读 · 0 评论 -
effective c++条款总结(3)
隐蔽的inline申请是将函数定义在class定义中。同时编译器通常不对通过函数指针进行的调用实现inlineinline void f() {...}void (*pf)() = f;...// f()将被inlined,pf()不被inlinedf();pf();尽量用object的引用或指针代替object去完成,尽量以class声明式代替class定义式,并为声明式和定义式提供不同的头文件。class B{public: ... static std::trl::s.原创 2021-11-20 15:45:02 · 242 阅读 · 0 评论 -
effective c++条款总计(2)
智能指针shared_ptr和auto_ptr都提供了一个get成员函数来执行显式转换,通过重载操作符operator->和operator*实现隐式转换。以const引用传值来避免切割问题,但不适用于内置类型,STL和函数对象。class A{public: ... std::string name() const; virtual void display() const;};class B : public A{public: ... virtual void disp.原创 2021-11-19 17:04:21 · 229 阅读 · 0 评论 -
effective c++ 条款总结(1)
对于单纯常量,最好以const对象或enums替换#defines对于形似函数的宏,最好改用inline函数替换#defines尽量使用conststd::vector<int> vec;// 注意下面的比较const std ::vector<int>::iterator iter = vec.begin();*iter = 10; //正确,iter相当于T* const++iter; //错误,iter本身不能改变const std ::vector<.原创 2021-11-19 00:32:02 · 208 阅读 · 0 评论 -
数组与指针——容易混淆的问题总结
本文通过对c++ primer的总结以及个人理解,总结成一篇博客帮助自己复习。数组在赋值的时候,总会出现一些比较混乱的情况,直接上栗子:我们在使用vector时,经常会因为括号问题出错。// 注意我们在使用vector<string>时不要用()对其初始化和赋值。vector<int> a(10); // 10个0vertor<int> b{10}; // 1个10vector<int> c(10, 1); // 10个1vector<in原创 2021-10-22 21:59:04 · 138 阅读 · 0 评论 -
Leetcode 题目解法分享 1
2023级毕业生,求职不易,愿大家都有一个更好的明天。接下来我会分享我在leetcode做的一些有趣的题,欢迎大家交流!在排序数组中查找元素的第一个和最后一个位置给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。栗子:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]输入:nums = [5,7,7,8,8,10], targ原创 2021-10-15 15:27:22 · 60 阅读 · 0 评论 -
【C++】标准模板库(STL)之accumulate
accumulate对顺序表元素顺序累计求和// 其中start指向首元素,end指向尾元素的下一个位置,因此要累计求和的元素范围是[start, end]accumulate(start, end, initialValue);//operator是一个函数,它规定了累计过程中的操作accumulate(start, end, initialValue, operator)利用acc...原创 2019-03-31 22:15:58 · 378 阅读 · 0 评论