自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Vcrossover的博客

我的第一篇博客!

  • 博客(60)
  • 收藏
  • 关注

原创 【Linux】grep命令使用场景

grep命令是文本搜索命令,它可以正则表达式搜索文本,也可从一个文件中的内容作为搜索关键字。grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容。参数:-a --text #不要忽略二进制的数据。-A<显示行数> --after-context=<显示行数> #除了显示符合范本样式的那一列之外,并显示该行之后的内容。-b --byte

2021-04-05 16:55:54 438 1

原创 【Linux】基础指令

文章目录一、Linux介绍Linux发展Linux特点CentOS二、基础命令目录相关命令文件相关命令压缩解压缩的命令匹配查找命令(常用)其他命令一、Linux介绍Linux发展  操作系统,英语Operating System简称为OS。说道操作系统就需要先讲一讲Unix,UNIX操作系统,是一个强大的多用户、多任务操作系统,支持多种处理器架构,按照操作系统的分类,属于分时操作系统,最早由KenThompson、Dennis Ritchie和Douglas McIlroy于1969年在AT&

2021-04-05 16:46:46 193

原创 【C++】虚函数表存放在哪里?

1.虚函数表是全局共享的元素,即全局仅有一个.2.虚函数表类似一个数组,类对象中存储vptr指针,指向虚函数表.即虚函数表不是函数,不是程序代码,不肯能存储在代码段.3.虚函数表存储虚函数的地址,即虚函数表的元素是指向类成员函数的指针,而类中虚函数的个数在编译时期可以确定,即虚函数表的大小可以确定,即大小是在编译时期确定的,不必动态分配内存空间存储虚函数表,所以不再堆中.根据以上特征,虚函数表类似于类中静态成员变量.静态成员变量也是全局共享,大小确定.所以我推测虚函数表和静态成员变量一样,存放在全局

2021-03-22 22:04:33 7169 5

原创 【C++】智能指针(史上最详细!)

智能指针为什么要有智能指针?智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的线程安全问题shared_ptr的循环引用循环引用分析为什么要有智能指针?下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort函数中的问题。void MergeSort(int* a, int n) { int* tmp = (int*)malloc(sizeof(int)*n); _MergeSort(a, 0

2021-03-14 17:11:56 520

原创 【C++】小知识---i++是不是原子操作?

1.不是原子操作理由:1.i++分为三个阶段:内存到寄存器寄存器自增写回内存这三个阶段中间都可以被中断分离开.举个例子,现有A,B两个线程,初始i=2;A线程完成1,2步后被切换到B线程,在B线程中执行完这3步,再切换回来,此时A寄存器中的i=3写回内存,故最后i=3,而不是正常的4;所以不是原子操作。2.++i呢在多核的机器上,cpu在读取内存i时也会可能发生同时读取到同一值,这就导致两次自增,实际只增加了一次。3.如何实现i++和++i的原子性呢?在多核CPU的复杂内存操作中,处理

2021-03-14 16:32:30 754

原创 【C语言】模拟实现memcpy、memmove、memset函数

memcpy原型void* (void* dest,const void* src,size_t len)为什么是void呢?,因为memcpy支持任何匀速类型的拷贝,所以给成void类型,然后在进行强制类型转化即可达到任意类型的拷贝。这同样也是strcpy和memcpy的一个差别,这里mempy是对内存进行操作的所以无论你是什么类型,都可以对其进行操作。memcpy模拟实现void *my_memcpy(void *det, const void *src, int num) { cha

2021-03-13 17:09:38 218

原创 【C语言】内存重叠详解

什么是“内存重叠”?当我们进行内存拷贝(memcpy函数)时,目标地址在原地址的范围内就造成了内存重叠。这么说可能会比较抽象,下面我们借助于memcpy函数通过一个例子说明。memcpy(void *dest, void *src, size_t num)是将src指向的地址中的num=5个字节拷贝到dest目标地址中。根据dest和src的关系,可以分为以下三类:case1:目标地址与源地址没有任何重叠(dest > src + 5或者dest < src - 5)时,可以直接从

2021-03-13 00:35:48 2232 2

原创 【C语言】strncpy详解

1.不考虑内存重叠的strncpy网上很多博客也写了这个函数,面试也常常会遇到,但是,我发现网上的很多代码都是有问题的,我们先看下大部分网上博客的实现:char *strncpy(char *dst, const char *src, size_t len){ assert(dst != NULL && src != NULL); char *res = dst; while (len--) { *dst++ = *src++; } return res;}看着好

2021-03-12 23:50:59 9391 1

原创 【C语言】strcpy函数的缺点

用法这是C语言里面复制字符串的库函数, 函数声明包括在专门处理字符串的头文件<string.h>中:char * strcpy( char * dst, const char * src );这个函数把字符串src复制到一分配好的字符串空间dst中,复制的时候包括标志字符串结尾的空字符一起复制。操作成功,返回dst,否则返回NULL.需要注意的问题函数里的局部变量一般都是按序排放的,并且因为是分配在堆栈之中,它们的地址是向下“增长”,即向低地址方向增长。比如下面的程序: int

2021-03-12 23:09:12 448

原创 【C++】四种类型转换

C语言的类型转换void Test (){ int i = 1; // 隐式类型转换 double d = i; printf("%d, %.2f\n" , i, d); int* p = &i; // 显示的强制类型转换 int address = (int) p; printf("%x, %d\n" , p, address);}缺陷: 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换C++强制类型转换标准C++为了加强类型转换的可视性,

2021-03-12 10:27:58 176

原创 【操作系统】并发和并行的区别

学习多线程的时候会遇到一个名词:并发。这是属于操作系统中的词汇,需要了解并发和并行的区别,从网上搜集了几种说法帮助理解。一:并发是指一个处理器同时处理多个任务。并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。来个比喻:并发是一个人同时吃三个馒头,而并行是三个人同时吃三个馒头。二:并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑

2021-03-11 11:51:31 2030

原创 【C++】lambda表达式详解

lambda表达式语法lambda表达式书写格式:[捕获列表] (参数列表) mutable -> 返回值类型 { 函数体}lambda表达式各部分说明:[] : 捕捉列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。():参数列表。与普通函数的参数列表一致,如果不需要参数传递,则可以连同()一起省略mutable:默认情况下,lambda函数总是一个const函数,mutable

2021-03-11 10:42:59 717

原创 【C++】如何更改const修饰的变量?

一、结论在定义变量的时候加上volatile关键字const volatile int i = 10;但是在我看来,程序员既然用const来修饰变量,那么就不希望其被修改,根据C++标准,对于修改const变量,属于:未定义行为。所以其实不建议这么做的。volatile关键字详解二、分析#include <stdio.h>int main(){ const volatile int i = 10; int* pi = (int*)(&i); *p

2021-03-11 09:23:15 465 2

原创 【C++】关联式容器(map)详解

map概念如果说set对应数学中的“集合”,那么map对应的就是“映射”。map是一种key-value型容器,其中key是关键字,起到索引作用,而value就是其对应的值。与set不同的是它支持下标访问。头文件是特点增加和删除节点对迭代器的影响很小(高效的插入与删除)快速的查找(同set)自动建立key-value的对应,key和value可以是任何你需要的类型可以根据key修改value的记录支持下标[]操作声明map<T1,T2> m其中T1是key类型,T2是v

2021-03-10 16:50:59 490

原创 【C++】关联式容器(set)详解

关联式容器  关联容器与序列容器有着根本性的不同,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的。关联容器支持高效的关键字查找与访问。两个主要的关联容器类型是map与set。set概念:set里面每个元素只存有一个key,它支持高效的关键字查询操作。set对应数学中的“集合”。特性储存同一类型的数据元素(这点和vector、queue等其他容器相同)每个元素的值都唯一(没有重复的元素)根据元素的值自动排列大小(有序性)无法直接修改

2021-03-10 16:42:22 477

原创 【C++】左值右值

左值右值什么是左值?什么是右值?左边的值和右边的值?不不不,这样不全面,先给你一个浅显的解释吧,左值就是可以被赋值的类型,右值就是不可以被赋值的值int a = 2;这个代码中a位于等于运算符左边,数值2位于等于运算符右边,所以a是左值,2是右值。问题来了:那我要是把2放在左边,2是不是就成左值了呢?刚入门的c语言程序员都知道这是不可能的,但是我们还是来写一下,看看编译器报错了什么。int a = 1;2 = a;当编译之后,给出以下报错:[Error] lvalue required a

2021-03-09 23:25:52 219

原创 【C语言】strcpy和strncpy的缺陷!

strcpy()函数应该是我们用的比较常用的一个函数,基本功能是将一个字符串拷贝到我指定的内存空间。但是要复制的字符串长度超过这段内存空间的话,结果可能是未知的。strcpy用法这是C语言里面复制字符串的库函数, 函数声明包括在专门处理字符串的头文件<string.h>中:char * strcpy( char * dst, const char * src );这个函数把字符串src复制到一分配好的字符串空间dst中,复制的时候包括标志字符串结尾的空字符一起复制。操作成功,返回dst,

2021-03-09 22:53:21 439

原创 【C++】memcpy能比较结构体吗?

比较两个结构体时, 若结构体中含有大量的成员变量, 为了方便, 程序员往往会直接使用memcmp对这两个结构体进行比较, 以避免对每个成员进行分别比较。 这样的代码写起来比较简单, 然而却很可能深藏隐患。 请看下面的示例代码:#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct padding_type { short m1; int m2;}padding_type_t

2021-03-09 21:34:48 913

原创 【C++】memset的坑!

memset函数常被我们用来初始化数组,然而有个坑可能会被我们踩到。静态数组初始化#include <cstring>int main(){ // 静态数组arr int arr[10]; // 将数组所有元素初始化为0 memset(arr,0,sizeof(arr)); // 遍历输出数组元素 for(int i=0;i<10;++i){ cout << arr[i] &lt

2021-03-09 21:33:32 337

原创 【C++】继承详解,菱形继承问题

继承体系概念继承方式赋值兼容规则同名隐藏子类对象的构造过程菱形继承概念是面向对象程序设计是代码可以复用的最重要的手段,它允许程序员在保持原有的类的特性的基础下进行拓展,增加功能。 这样产生的类被称为派生类;class Person{public:void Print(){cout << "name:" << _name << endl; cout << "age:" << _age << endl;}protecte

2021-03-04 17:46:51 1850 1

原创 【C++】迭代器

概念迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。简单来说,迭代器就相当于一个指针,通过这个指针我们可以对一些容器进行遍历。解决了容器底层空间遍历时不连续的问题。分类正向迭代器容器类名::iterator 迭代器名;//正向遍历的思想int array[]={1,2,3,4,5,6,7,8,9,0};for(int i = 0;i<sizeof(array)/siz

2021-03-03 23:47:13 399 1

原创 【C++】容器适配器-----stack、queue、priority_queue

容器适配器概念分类接口底层结构stack模拟实现queue模拟实现priority_queue模拟实现概念  我们可以简单的将容器适配器当做一个接口装置。有的电脑上没有数据转接口,但是有usb接口,这是我们没必要重新买一个电脑,我们可以做一个usb数据转接线。而这根数据转接线就类似于适配器一样。  在C++中,我们已经有了(vector、list、deque等容器)插入、删除、迭代器就电脑usb接口,当我们想要实现栈的操作时,我么没有必要再重新写新的数据结构,只需要将其接口进行重新的封装,相当于做了一

2021-03-03 23:41:59 201 1

原创 【C++】避免重复包含头文件方法

#pragmaonce这个宏有什么作用?为了避免同一个头文件被包含(include)多次,C/C++中有两种宏实现方式:一种是#ifndef方式;另一种是#pragma once方式。在能够支持这两种方式的编译器上,二者并没有太大的区别。但两者仍然有一些细微的区别。两者的使用方式有何区别?方式一:#ifndef SOMEFILE_H#define SOMEFILE_H… … // 声明、定义语句#endif方式二:#pragmaonce… … // 声明、定义语句两者各有何特点

2021-02-28 11:43:40 242

原创 【C++】模板详解

模板分类函数模本类模本函数模板template<class T>T Add(T left,T right) return left+right;上述代码只有经过实例化之后才会形成真正的函数,没有进行实例化之前,它只能称为一个函数模板。模板的实例化是指函数模板(或者类模板)生成相应的模板函数(或模板类)的过程。函数模板实例化之后会生成一个真正的函数,但是由于类中的成员函数只有被调用的时候才会初始化,所以类模板经过实例化之后,只是对类进行定义。模板实例化的分类显示实例化

2021-02-08 15:42:37 129

原创 学习小结

  今天又是元气慢慢的一天,在学习C++的路上越走越稳了,最近买了几本书,趁着这一段时间的学习来巩固一下学习的知识点。《C++primer plus》这本书真的是像砖一样厚啊,但是慢慢看进去还是很有帮助的呢,里面讲解的也是很细,慢慢品味这本书,从中又能学到很多知识。总有一天会读完这本书的o(╥﹏╥)o。  对于前面学到的知识也一定要进行温习哦,不然很容易遗忘的,毕竟C++知识点很多,很杂,不经常使用的话,很容易猴子搬苞米的。最近的学习状态还算可以,继续加油!...

2021-02-08 15:30:49 85

原创 【C++】内存泄漏详解

内存泄漏内存泄漏是什么内存泄漏造成的后果内存泄漏的原因内存泄漏的解决方法内存泄漏是什么内存泄漏指的是由于疏忽或错误造成了程序未能释放掉不再使用的内存。内存泄漏造成的后果性能不良,内存会耗尽内存泄漏的原因  对于C++的内存泄漏,总结一句话:就是new出来的内存没有通过delete合理的释放掉!下面总结几种常见的内存泄漏的场景:程序循环new创建出来的对象没有及时的delete掉,导致了内存的泄露#include <iostream>#include <new.h&g

2021-02-08 15:02:08 667

原创 【C++】动态内存管理

C++中内存的分布情况内核空间:操作系统相关的代码,用户不能直接访问。栈(由上到下):存储非静态局部变量、函数参数、返回值。内存映射段:静态库,动态库。堆(由下到上):程序运行时动态内存分配,malloc,calloc,realloc,new,new[]申请的空间。数据段:存储全局变量、静态数据。代码段:可执行代码,只读常量。内存函数的区别相同点:都是C语言的库函数,使用时都需要包含头文件返回值都是void*,都需要进行强制类型转换申请成功时返回空间的首地址,失败时返回NULL,所

2021-02-08 12:49:29 82

原创 【C++】static关键字详解

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

2021-02-05 15:51:19 658

原创 【C++】Volatile关键字浅析

一、概念   volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统,硬件或者其他线程等。   遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:volatile int vInt; 当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。volatile int i=10; int

2021-02-05 15:44:21 140

原创 【C++】单例模式详解

一、简介单例模式,指的是某一个类,只允许实例出一个对象存在。而实现单例模式有懒汉式和饿汉式。饿汉式指的是在创建类时就初始化好对象,,而懒汉式指的是在需要使用到对象实例时,才进行初始化对象。二、实现方式1、懒汉模式 第一次用到类实例的时候才会去实例化。class singleton{protected: singleton(){}private: static singleton* p;public: static singleton* instance() { if (p ==

2021-02-05 15:43:19 1693

原创 【C++】析构函数详解

概念析构函数:与构造函数功能相反,析构函数是完成对象的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成类的一些资源清理工作。特性析构函数名是在类名前加上字符 ~无参数无返回值。一个类有且只有一个析构函数。若用户没有显式定义,系统会自动生成默认的析构函数。(不一定会,下面进行解答)1、在下面这个类中,并没有显示定义析构函数,但是编辑器不会生成默认的析构函数,因为在这个类中没有进行资源的管理,所以不需要析构函数。class Date{ Data(int yea

2021-01-29 10:13:43 767

原创 【C++】什么情况下编辑器自动生成默认的构造函数?(详解)

  首先我们需要明确,在没有显示定义构造函数的时候,编辑器不一定会自动生成默认的构造函数  对c++初学者来说存在一个误区,如果类没有定义任何构造函数,编译器会自动生成默认的构造函数。正确的说法:只有默认构造函数”被需要“的时候编译器才会生成默认构造函数。那么什么时候是编辑器自己想生成的呢?这里我们给出了四个场景 :场景一:含有类对象数据成员,该类对象类型有默认构造函数class A{public: A() { cout << "A()" << endl;

2021-01-25 12:27:05 3048

原创 【C++】构造函数不能为哪些情况

构造函数不能为哪些情况1、构造函数不能用const修饰构造函数需要初始化成员变量,如果声明为const函数,则无法修改成员变量;2、构造函数不能是静态成员函数,也就是不能用static修饰静态成员函数是属于整个类的,不是属于对象的,是所有对象共享的资源。没有this指针,不能通过this指针来进行对象的调用。3、构造函数不能为虚函数构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时,由于对象还未构造成功。编译器无法知道对象 的实际

2021-01-25 11:40:51 1735

原创 【C++】必须在初始化列表中初始化的情况

必须用到初始化成员列表的四种情况:初始化一个引用类型的成员变量因为引用在使用的时候必须进行初始化操作#include <iostream>using namespace std; class A{ public: A(int &v) : i(v), p(v), j(v) {} void print_val() { cout << "hello:" << i << " " <<

2021-01-25 11:13:06 531

转载 【C++】Debug和Release的区别

debug 和 release 版本有什么不同Debug :调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供 强大的应用程序调试能力。Debug模式下生成两个文件:除了**.exe或者.dll**文件外,还有一个.pdb文件,该文件记录了代码中断点等调试信息。Release:发布版本,不对源代码进行调试,编译时对应用程序的速度进行优化,使得程序在代码大小和运行速度上都是最优的(调试信息可以在单独的PDB文件中生成)。Release模式下

2021-01-21 09:53:57 1613 1

原创 【C语言】冷知识——前置++和后置++

今天在学习运算符的时候,发现了一个非常有意思的现象,关于前置++和后置++的不同之处。前置++是先给变量+1,然后进行使用后置++是先使用变量,然后进行+1.首先先给大家看一段代码,看看大家是否能正确得出结论int i=0;int j=0;printf(“%d %d %d”,i++,i++,i++);printf(“%d %d %d”,++j,++j,++j);大家觉得答案是什么呢?可以先自己进行运算,下面我们给出结论:2 , 1, 0 //后置++3 , 3, 3 /

2021-01-20 09:58:27 2089

原创 【C语言】变长结构体

什么叫变长结构体?其实真正意义上并不是结构体的大小可变,而是使用结构体中的变量代表一个地址,从而访问超出结构体大小范围的数据。struct Var_Len_Struct{ int nsize; char buffer[0];};那结构体是怎么实现可变长的呢?如上所示,请注意看结构体中的最后一个元素,一个没有元素的数组。我们可以通过动态开辟一个比结构体大的空间,然后让buffer去指向那些额外的空间,这样就可以实现可变长的结构体了。更为巧妙的是,我们甚至可以用nsize存储字符

2021-01-19 09:19:00 1811

原创 【C语言】sizeof和strlen区别

首先我们来看一下sizeof和strlen的区别:sizeof操作符的结果类型为size_t(它在头文件用typedfe定义为unsigned int类型),计算的是分配空间的实际字节数。strlen结果类型也为size_t(size_t strlen( const char *string )),但strlen是计算的空间中字符的个数(不包括‘\0’)。sizeof是运算符,可以以类型、函数、做参数 。strlen是函数,只能以char*(字符串)做参数。而且,要想得到的结果正确必须包含 ‘\0’

2021-01-15 11:43:36 146

转载 【C语言】程序编译过程详解

我们的代码会经过这4个环节,从而形成最终文件,c语言作为编译语言,用来向计算机发出指令。让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。预处理, 展开头文件/宏替换/去掉注释/条件编译 (test.i main .i)编译, 检查语法,生成汇编 ( test.s main .s)汇编, 汇编代码转换机器

2021-01-14 12:48:15 394

原创 【C语言】内存对齐和大小端问题

首先我们先举个例子,试着算一下结构体的大小class S1{ char _c1; int _i; char _c2;};class S2{ char c1; char c2; int i;};class S3{ double d; char c; int i;};class S4{ char c1; struct S3 s3; double d;};我们先来看一下结构体内存对齐的规则:第一个成员在与结构体偏移量为0的地址处。

2021-01-14 12:44:12 502

空空如也

空空如也

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

TA关注的人

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