自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 GET和POST的区别总结

概括GET方式请求:浏览器会把httpheader和data并发送出去,服务器响应200(返回数据)POST方式请求:浏览器先发送 header,服务器响应100 continue,浏览器再发送data,服务器响应200ok(返回数据)区别get参数通过ur传递,post放在 request body中。ge请求在u中传递的参数是有长度限制的,而pos没有。get比post更不安全,因为参数直接暴露在u中,所以不能用来传递敏感信息。(实际上两者都不是安全的,因为都可以被抓包捕获)get请

2021-02-24 19:45:54 171

原创 操作系统中的结构体对齐、字节对齐

1、原因平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛岀硬件异常。性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。2、规则数据成员对齐规则:结构(stru或联合 union的数据成员,第一个数据成员放在 offset0的地方,以后每个数据成员的对齐按照# pragma pack指定的数值和这个数据成员自身长

2021-02-24 09:11:32 350

原创 算法刷题时使用if else if与连续if if语句的区别

使用if else输出结果为1#include <iostream>using namespace std;int main () { int a1=1, a2=2, a3=3, a4=4; if (a1 == 1) cout << a1; else if (a2 == 2) cout << a2; else if (a3 == 3) cout << a3; else if (a4 == 4) cout <<

2021-02-14 11:31:58 1040 2

原创 如何屏蔽SIGPIPE信号

#include <stdlib.h>#include <sys/signal.h>//默认读写一个关闭的socket会触发sigpipe信号 该信号的默认操作是关闭进程 这明显是我们不想要的//所以我们需要重新设置sigpipe的信号回调操作函数 比如忽略操作等 使得我们可以防止调用它的默认操作 //信号的处理是异步操作 也就是说 在这一条语句以后继续往下执行中如果碰到信号依旧会调用信号的回调处理函数//处理sigpipe信号void handle_for_s

2021-02-10 13:08:18 1664

原创 for(;;)与while(true)的区别

死循环的有两种写法for(; ;);while(true); // while(1)两者有何区别,为何在源码中多以for(; ;)形式居多?对两条语句分别进行编译结果如下:// 编译前while(1);//编译后mov eax, 1test eax, eaxje foo+23hjmp foo+18h// 编译前for(; ;);// 编译后jmp foo+23h通过对两者分别编译后对比,for(; ;)语句不仅指令少、不占用寄存器,还没有跳转判断指令,比while(1)

2021-02-10 10:02:47 325

原创 C++源文件从文本到可执行文件经历的过程

对于C++源文件,从文本到可执行文件般需要四个过程预处理阶段:对源代码文件中文件包含关系(头文件)、预编译语句(宏定义)进行分析和替换,生成预编译文件。编译阶段:将经过预处理后的预编译文件转换成特定汇编代码,生成汇编文件汇编阶段:将编译阶段生成的汇编文件转化成机器码,生成可重定位目标文件链接阶段:将多个目标文件及所需要的库连接成最终的可执行目标文件...

2021-02-07 22:35:36 198

原创 C++左值引用与右值引用概念

右值引用是C++11中引入的新特性,它实现了转移语义和精确传递。它的主要目的有两个方面:1、消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。2、能够更简洁明确地定义泛型函数左值和右值的概念左值:能对表达式取地址、或具名对象变量。一般指表达式结束后依然存在的持久对象。右值:不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象。右值引用和左值引用的区别:1.左值可以寻址,而右值不可以。2.左值可以被赋值,右值不可以被赋值,可以用来给左值赋值。3.左值可变右值不.

2021-02-07 22:30:05 96

原创 STL知识点 | 迭代器的作用、有指针为何还要迭代器、迭代器是如何删除元素的

迭代器iterator(迭代器)模式又称 Cursor(游标)模式,用于提供-种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示。或者这样说可能更容易理解:iterator模式是运用于聚合对象的—种模式,通过运用该模式,使得我们可以在不知道对象内部表示的凊况下,按照一定顺序(由 iterator提供的方法)访问聚合对象中的各个元素。由于 Iterator模式的以上特性:与聚合对象耦合,在一定程度上限制了它的广泛运用,一般仅用于底层聚合支持类,如STL的list、 vector、 s.

2021-02-07 07:36:55 393 1

原创 Linux知识点 | select和epoll的区别、原理、性能、限制

说一说select原理select相关调用函数void FD_ZERO(fd_set *set); // 将set清空为0void FD_CLR(int fd, fd_set *set); // 将fd从set中清除出去void FD_SET(int fd, fd_set *set); // 将fd设置到set中去int FD_ISSET(int fd, fd_set *set); // 判断fd是否在集合中select在使用前,先将需要监控的描述符对应的bi位置1,然

2021-02-06 08:51:45 1425

原创 STL知识点 | map和set的区别与实现

map和set的定义:map和set都是C++的关联容器,其底层实现都是红黑树(RB-Tree)。由于map和set所开放的各种操作接口,RB-tree也都提供了,所以几乎所有的map和set的操作行为,都只是转调RB-tree的操作行为。map和set的区别:(1)map中的元素是 key-value(关键字值)对:关键字起到索引的作用,值则表示与索引相关联的数据;Set与之相对就是关键字的简单集合,set中每个元素只包含一个关鍵字。(2)set的迭代器是 const的,不允许修改元素的值;ma.

2021-02-05 09:38:42 270

原创 数组中未出现的最小正整数

问题描述:给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。要求 :解决方案实现时间复杂度为 O(n) 并且只使用常数级别额外空间。本地编译器运行代码如下:#include<iostream>using namespace std;void swap(int* arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp;}int main() { int a.

2021-02-05 08:35:01 775

原创 C++知识点 | 虚函数与多态的实现

虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。当子类继承了父类的时候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址。使用了虚函数,会增加访问内存开销,降低效率。多态的实现:多态的实现主要分为静态多态和动态多态,静态多态主要是重载,在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个子.

2021-02-05 08:11:32 266

原创 C++知识点 | 静态函数与虚函数、重载与重写的区别

静态函数和虚函数的区别静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销重载与重写的区别重载:两个函数名相同,但是参数列表不同(个数,类型),返回值类型没有要求,在同一作用域中重写:子类继承了父类,父类中的函数是虚函数,在子类中重新定义了这个虚函数,这种情况是重写...

2021-02-05 08:05:19 468

原创 C++经典面试题 | 析构函数与虚函数

为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数?参考回答:将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用父类指针或引用指向该子类对象,释放父类指针时可以释放掉子类的空间,防止内存泄漏。C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。...

2021-02-05 08:00:54 257

原创 Linux下Web性能压力测试工具之WebBench

WebBenchan安装wget http://www.ha97.com/code/webbench-1.5.tar.gztar zxvf webbench-1.5.tar.gzcd webbench-1.5makemake installWebBench使用webbench -c 1000 -t 60 http://192.168.80.157/phpinfo.php// webbench -c 并发数 -t 运行测试时间 URLApache测试实例结果并发数为300时root

2021-02-04 08:37:07 351

原创 C++四种智能指针详解

四种智能指针:shared_ptr,unique_ptr,weak_ptr,auto_ptrC++里面的四个智能指针:shared_ptr,unique_ptr,weak_ptr,auto_ptr其中前三个是c++11支持,并且最后一个已经被11弃用。智能指针的使用智能指针主要用于管理在堆上分配的内存,它将普通的指针封装为一个栈对象。当栈对象的生存周期结束后,会在析构函数中释放掉申请的内存,从而防止内存泄漏。C++11中最常用的智能指针类型为 shared_ptr它采用引用计数的方法,记录当前内存资源

2021-02-04 08:35:08 1347

原创 C++面试经典题 | 指针和引用、指针和数组的区别

说一下指针和引用的区别指针是变量,这个变量存放的是所指内容的地址。引用是别名,与所引用变量占用同一内存空间使用 sizeof看一个指针的大小是4,而引用则是被引用对象的大指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象可以有 const指针,但是没有 const引用指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变指针可以有多级指针(*p),而引用只有一

2021-02-03 09:05:30 348

原创 C++面试经典题 | C++中四种强制类型转换

说一说C++中的四个cast转换C++中四种类型转换是:static cast, dynamic cast, const cast, reinterpret castconst cast用于将cons变量转为非 conststatic cast用于各种隐式转换,比如非cons转onst,wod转指针等 static cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知dynamic cast用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。

2021-02-03 08:58:24 624 5

原创 C++面试经典题 | static关键字的作用

说一下static关键字的作用全局静态变量在全局变量前加上关键字 static,全局变量就定义成一个全局静态变量静态存储区,在整个程序运行期间一直初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾局部静态变量在局部变量之前加上关键字 static,局部变量就成为一个局部静态变量。内存中的位置:静态存储区初始化:末经初始化的全局静态变量会被自动初始化为0(自动对象的值

2021-02-03 08:51:57 2201 4

原创 new/delete和malloc/free的区别联系

1.先来谈谈new和delete在C++中堆内存的分配和释放是通过new和delete来操作的,它们和C语言的malloc和free有什么区别呢?(1)new的底层也是通过malloc来开辟内存的new比malloc多一项功能,就是开辟完内存,还可以进行初始化操作如下:int *p = new int(10);上面是new的基本操作,10代表堆上开辟的整形内存的初始值;如果是自定义类类型的话,如下:Test *p = new Test(); // Tset是一个实现定义好的类这个语句不

2021-02-02 08:20:36 1221 2

原创 如何在本地编译器上调试leetcode的代码

题目描述题目链接:https://leetcode-cn.com/problems/two-sum在leetcode上的解题代码class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { map<int,int> tmp; // 建立hash表存放数组元素 vector<int> res(2,-1)

2021-02-01 11:57:01 4229 2

原创 vector扩容时以2倍或1.5倍扩容的原因

vector扩容原理Vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素;对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了 ;不同的编译器实现的扩容方式不一样,VS2019中以1.5倍扩容,GCC以2倍扩容。vector扩容代码示例:#include<iostream>#include<vector>using namespace

2021-02-01 08:33:37 4745 1

空空如也

空空如也

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

TA关注的人

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