![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
Fm镄
这个作者很懒,什么都没留下…
展开
-
C++ STL源码分析(五):deque、stack\queue
deque得底层并不是连续空间,但通过deque iterator中得函数重载模拟出了连续空间得效果。stack 和queue直接内置一个deque来实现对应功能。list也可以作为stack 和queue的容器,原创 2020-07-01 20:15:37 · 214 阅读 · 0 评论 -
C++STL源码分析(四):vector 其实不太容易忘记,所以先简单记录吧,等有空了再好好得整理!!
vector基本就是一个数组,但当数组用完后会自动扩充。但不可能在原地进行扩充,因为后面得连续空间不一定够用。所以它会以某一种策略找一块新得内存空间进行分配二倍增长得过程中会大量调用拷贝构造函数和析构函数...原创 2020-06-30 21:40:39 · 139 阅读 · 0 评论 -
C++STL源码分析(三):迭代器和iterator Teaits
1.Iterator需要遵循的原则iterators 是算法和容器的桥梁,迭代器将容器中的一段范围告诉算法Iterator由于算法的执行需要,要具备5个associated type:iterator_traits<_Iter>::iteraptor_category:迭代器的类型 ,有的只能++ 、有的能-- 、有的能跳跃前进 value_type 指向元素的类型 difference_type:两个iterator间的距离用什么 type来表示 reference: 未被使原创 2020-06-30 16:49:00 · 269 阅读 · 0 评论 -
C++ STL源码分析(二):STL的幕后英雄-----分配器
STL的幕后英雄----分配器allocators1.由operator new() 和 malloc()讲起先说一个实际的观念:所有的分配动作,一层一层的下去,C++向下最后都会到c这个level(C runtime memory)所提供的malloc函数,这个函数在根据它是在windows或linux等不同操作系统里面的system api去拿到真正的内存。1.1new operator 和 operator new我们平时用来创建新对象的new关键字其实是 new operator;原创 2020-06-28 22:08:00 · 254 阅读 · 0 评论 -
C++重要知识清单:类型转换
1.类型转换名称和语法c语言风格的强制类型转换(Type Cast)比较简单,不管什么类型的转换统统是:TYPE b =(TYPE)aC++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。static_cast 静态类型转换。如 int 转换成char reinterpreter_cast 重新解释类型 dynamic_cast 命名上理解是动态类型转换。如子类和父类之间的多态类型转换 const_cast 字面上理解就是去const 属性4种类型转换的格式:TYPE原创 2020-06-27 15:30:56 · 172 阅读 · 0 评论 -
C++ STL源码分析(一):STL体系结构和一些基础知识
C++ Standard LibraryC++付给你得头文件Standard Template Library在标准库中百分之80是STL,标准库>STL,STL有6大部件标准库以header files形式呈现C++标准库得header files 不带副档名(.h) 例如:#include<vector> 新式C header files 不带副档名.h 例如: #include<cstdio> 旧式C header files(带有副档名 .h).原创 2020-06-26 15:28:35 · 571 阅读 · 0 评论 -
C++重要知识清单:多线程基础
0.前言并发编程的两种模型:1.多进程每个进程只是一个线程,进程间可以相互通信;进程通信的方式有:文件、管道、消息队列。优缺点:2.多线程一个进程有多个线程,线程间通过共享内存的方式进行通信。优缺点:相对于进程来说,线程启动速度很快,因为系统会分配一系列的内部资源来管理进程,所以线程更轻量级。 开销更低1.核心对象和函数1.1threadget_id()获取当前线程的id,异步时不一定准确yield :把CPU当前所有权返回给系统...原创 2020-06-18 20:15:50 · 244 阅读 · 0 评论 -
C++重要知识清单:搞懂智能指针
0.前言首先先分享一个在线的C++文档。https://zh.cppreference.com/w/cpp/memory我们都知道,C++没有提供类似于JAVA的垃圾回收GC机制,所以所有的动态内存管理都是由我们程序猿通过代码来进行的。而在实际的开发中,经常会出现以下7种内存问题:动态内存泄漏:new之后的对象没有delete,或者new delete和malloc free混合使用等等导致 资源的泄漏:文件指针使用后没有关闭进行文件资源的释放 动态的内存越界 数组内存越界 动态内存原创 2020-06-16 16:42:01 · 227 阅读 · 0 评论 -
C++重要知识清单:完全搞懂异常处理机制
1.异常处理的思想传统错误处理是通过函数返回值来处理错误而异常处理机制的思想如下:C++的异常处理机制使得异常的引发和异常的处理解耦合。这样底层的函数可以着重解决具体问题,而不必过多的考虑异常处理的问题。上层的调用者可以设计针对不同类型异常的处理。 异常是专门针对抽象编程种的一系列错误处理的,C++中不能借助函数机制,因为栈结构的本质是先进后出,依次访问,无法进行跳跃,但错误处理...原创 2020-05-06 22:09:34 · 149 阅读 · 0 评论 -
C++重要知识清单:泛型编程(函数模板和类模板机制)包含模板机制的底层实现原理
1.泛型编程相关概念模板机制C++提供两种模板机制:函数模板、类模板 类属----类型参数化,又称参数模板:使得程序或算法可以从逻辑功能上抽象,把被处理的对象类型或数据类型作为参数进行传递 模板把函数或类要处理的数据类型参数化,表现为参数的多态性,称为类属。 模板用于表达逻辑结构相同,但具体数据元素类型不同的数据对象的通用行为2.函数模板2.1为什么要有函数模板呢?首先看下...原创 2020-05-06 20:48:36 · 1352 阅读 · 2 评论 -
C++重要知识清单:编译器编译原理
编译器编译原理1)什么是gcc?gcc是GNU Compiler Collection的缩写。最初是作为C语言的编译器(GNU C Compiler),现在已经支持多种语言了,如C、C++、Java、Pascal、Ada、COBOL语言等。gcc支持多种硬件平台,甚至对Don Knuth 设计的 MMIX 这类不常见的计算机都提供了完善的支持。2)gcc主要特征gcc是一个可移...原创 2020-05-06 15:50:45 · 431 阅读 · 0 评论 -
C++重要知识清单:完全搞懂纯虚函数和抽象类
1.基本概念1.1纯虚函数纯虚函数是一个在基类中说明得虚函数,在基类中没有定义,要求任何派生类都要定义自己的版本 纯虚函数为各个派生类提供了一个公共界面(接口的封装和设计、软件的模块功能划分) 纯虚函数语法: virtual 类型 函数名(参数表)=0;1.2抽象类一个具有纯虚函数的基类称为抽象类抽象类不能建立对象,但可以声明抽象类的指针 抽象类不能作为返回类型 抽象类...原创 2020-05-06 14:20:12 · 190 阅读 · 0 评论 -
C++重要知识清单:完全搞懂多态(主要讲底层原理,略过一些最基础的概念)
1.初见多态1.1引言面向对象的三大概念(封装、继承、多态)其实代表了三种境界。封装突破了函数的概念,产生了用类去解决问题的思想;继承解决了工程上的代码复用问题,让程序猿可以复用以前人写过的代码;而多态不光可以继承前人写过的代码,它能够复用后人写过的代码,80年代人写的代码可以使用21世纪人写的代码,可以扩展后来的标准;多态是设计模式的基础,是编写框架的基础1.2问题引出当类型兼容...原创 2020-05-02 11:57:30 · 315 阅读 · 1 评论 -
C++重要知识清单:完全搞懂继承(单继承、多继承、虚继承)
1.初见继承1.1引言面向对象程序设计有4个主要特点:抽象、封装、继承和多态性。学会了类和对像就基本了解数据抽象与封装。继承性是面向对象程序设计最重要的特征,如果没有掌握继承性,就等于没有掌握类和对象的精华。1.2继承相关概念简单地说:A is a B;这就是继承关系。比如 :男性和女性相对于人类而言就是一种继承关系。 继承具有传递性,但不具有对称性。 比如:小男孩是男人也是...原创 2020-04-18 21:53:29 · 541 阅读 · 0 评论 -
C++重要知识清单:完全搞懂运算符重载
1.什么是运算符重载在实际开发中,我们经常会自己定义数据类型,也经常需要对这些自定义数据类型进行+-*/等常用的计算。这时C++自带的这些操作符却并没有处理我们自定义数据类型的能力,所以就需要我们对这些操作符的功能进行扩展。而实现这一功能的方式就叫做操作符重载。其实重载这个概念大家一定并不陌生,所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。运算符...原创 2020-04-06 15:07:20 · 573 阅读 · 3 评论 -
C++重要知识清单:友元函数和友元类
友元1.问题由来:在工程开发的过程中,可能会出现我们需要一个函数频繁的对某个类内部的私有成员进行使用和处理。但由于类的封装性和信息隐藏性,只有同类的对象间具有无私处的特性。外部函数和其他类的成员函数都不能访问这个类的私有变量。为了解决这个问题,C++提供了友元这一功能。2.功能描述:友元,顾名思义它是类的好朋友。在友元的内部可以修改这个类的私有属性。所以友元破坏了类的封装性。友...原创 2020-04-05 16:37:50 · 324 阅读 · 0 评论 -
C++重要知识清单:STL容器算法迭代器(未完待续)
STL的容易通过类模板技术,实现数据类型和容易模型的分离简单的理解就是我们可以使用任何一个容器来存储任何一个简单数据类型或自定义的数据类型。STL的迭代器技术实现了遍历容器的统一方法;也为STL的算法统一性奠定了基础STL的算法通过函数对象实现了自定义数据类型的算法运算;...原创 2020-04-04 10:31:28 · 133 阅读 · 0 评论 -
C++重要知识清单:static在类中的使用(静态成员变量、成员函数)
感觉需要特殊写的只有这几点:静态成员变量被全部对象共享 静态成员函数中不能调用普通成员属性或普通成员函数 静态成员函数中没有this指针原创 2020-03-18 09:32:24 · 325 阅读 · 0 评论 -
C++重要知识清单:详解对象的动态建立和释放(new和delete)
1.基本语法C语言中是利用库函数malloc和free来分配和撤销内存空间的。C++提供了较简便而功能较强的运算符new和delete来取代malloc和free函数。new和delete是运算符,不是函数,因此执行效率高。new运算符动态分配堆内存指针变量=new 类型(常量);指针变量=new类型[表达式];作用:从堆分配一快“类型“大小的存储空间,返回首地址,”常量“是...原创 2020-03-16 21:34:55 · 472 阅读 · 0 评论 -
C++重要知识清单:详解多个对象的构造和析构过程(对象初始化列表)
1.问题由来如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,没有默认构造函数。例如在下面这段代码的场景中,如何定义一个B对象则会报错,因为A没有无参构造函数。class A{public: A(int a) { this->a = a; }private: int a;};class B{private: ...原创 2020-03-16 20:08:46 · 255 阅读 · 0 评论 -
C++重要知识清单:详解拷贝构造函数(赋值构造函数、深拷贝和浅拷贝)
拷贝构造函数基本概念1.函数原型既然是函数就会有函数原型,拷贝构造函数也不例外,它的原型就长这样:class Test{public: Test() {} //拷贝构造函数,赋值构造函数 Test(const Test &obj) { cout << "我是拷贝构造函数" << endl; } ~Test() {}};2....原创 2020-03-16 16:15:12 · 306 阅读 · 0 评论 -
C++重要知识清单:函数指针
定义一个函数类型这个问题太简单不过了 ,随便举一个例子//定义了一个函数类型typedef int(Myfunction)(int a,int b);定义一个函数指针类型//这样就定义了一个函数指针变量Myfunction * myfun=NULL;//也可以先定义函数指针类型,然后定义函数指针变量typedef int(* Myfunction)(int a,in...原创 2020-03-03 20:16:00 · 80 阅读 · 0 评论 -
C++重要知识清单:引用的一些易忘点
指针的引用在c语言中获取被调用函数中一块内存中的资源要用二级指针,如下:struct Car{ int id; string name;}//形参为二级指针int getCar(Car ** p){ Car* tmp=NULL; tmp=(Car*)malloc(sizeof(Car)); tmp->id=1; tmp->...原创 2020-03-03 18:58:22 · 114 阅读 · 0 评论 -
C++重要知识清单:内存四区模型
内存四区的建立流程:1.操作系统把物理硬盘代码load到内存2.操作系统把C++代码分成四个区3.操作系统找到main函数入口执行各区解释:栈区(stack):由编译器自动分配释放,存储函数的参数值,局部变量的值等。堆区(heap):一般由程序员分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收。全局区(静态区)(static):全局变...原创 2020-03-03 14:55:59 · 144 阅读 · 0 评论 -
C++中的const和volatile详解/详解C++常量(2) 非常详细!!!!!!!!!
接着上次的内容,接下来记录一下const在函数参数和返回值中的作用。3.函数参数和返回值 用const限定函数参数及返回值是常量概念容易引起混淆的另一个地方。如果按值传递对象,对客户来讲,用const限定没有意义(它意味着传递的参数在函数里是不能被修改的)。如果按常量返回用户定义类型的一个对象的值,这意味着返回值不能被修改。如果传递并返回地址,const将保证该地址内容不会被改变。...原创 2019-03-09 11:26:51 · 238 阅读 · 0 评论 -
C++拷贝构造函数
一. 什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a = 100;int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。#include <iostream>using namespace std;class CExample {private...转载 2019-03-06 15:53:52 · 89 阅读 · 0 评论 -
C++虚继承
转自https://blog.csdn.net/bxw1992/article/details/77726390虚继承和虚函数是完全无相关的两个概念。虚继承是解决C++多重继承问题的一种手段,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题,通常可以将派生类对象的地址赋值给基类对象,实现的具体方式是,将基类指针指向继承类(继承类...转载 2019-03-06 15:34:58 · 126 阅读 · 0 评论 -
C++中的const和volatile详解/详解C++常量(1) 非常详细!!!!!!!!!
先简单描述一下: 限定词const告诉编译器"这是不会改变的"(这就允许编译器执行额外的优化);而限定词volatile则告诉编译器"不知道何时会改变",防止编译器依据变量的稳定性做任何优化。当读在代码控制之外的某个值时,例如读一块通信硬件中的寄存器,将使用这个关键字。无论何时需要volatile变量的值,都能读到,即使在该行之前刚刚读过。 "在代码的控制之外"的某个存储空间...原创 2019-03-08 16:49:19 · 914 阅读 · 3 评论 -
广义表
一、广义表的定义广义表简称表,它是线性表的推广。一个广义表是n(n≥0)个元素的一个序列,若n=0时则称为空表。设ai为广义表的第i个元素,则广义表GL的一般表示与线性表相同:GL=(a1,a2,…,ai,…,an)其中n表示广义表的长度,即广义表中所含元素的个数,n≥0。如果ai是单个数据元素,则ai是广义表GL的原子;如果ai是一个广义表,则ai是广义表GL...原创 2019-03-02 13:22:04 · 628 阅读 · 0 评论 -
内存对齐
内存对齐原则:一、结构体变量的首地址能够被其最宽基本类型成员大小与对齐基数中的较小者所整除;二、结构体每个成员相对于结构体首地址的偏移量(offset)都是该成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);三、结构体的总大小为结构体最宽基本类型成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在最末一个成员之后加上填充字节...原创 2019-03-02 09:55:29 · 147 阅读 · 0 评论 -
编译过程
某些语言(特别是C/C++)编译时首先要对源代码执行预处理。预处理器(preprocessor)是一个简单的程序,它用程序员(利用预处理器指令)定义好的模式代替源代码中的模式。预处理器指令用来节省输入,增加代码的可读性。预处理过的代码通常存放在一个中间文件中。(C++程序设计并不鼓励多使用预处理指令,因为可能会引起一些不易发现的错误)编译一般分两遍进行。首先,对预处理过的代码进行语法分析。...原创 2019-02-25 13:39:59 · 130 阅读 · 0 评论 -
C++内联函数
看到一篇写的不错得文章,转载以下。https://www.cnblogs.com/shijingjing07/p/5523224.html1.函数调用原理"编译过程的最终产品是可执行程序--由一组机器语言指令组成。运行程序时,操作系统将这些指令载入计算机内存中,因此每条指令都有特定的内存地址。计算机随后将逐步执行这些指令。有时(如有循环和分支语句时),将跳过一些指令,向前或向后跳到特定地...转载 2019-03-04 10:22:02 · 125 阅读 · 0 评论 -
C/C++程序编译流程
转自:http://www.cnblogs.com/lulipro/p/5105091.html单个文件的编译过程多个文件的编译过程转载 2019-03-04 10:50:01 · 112 阅读 · 0 评论 -
C++转换符(类之间的类型转换) 持续更新
在C++中,下列哪一个可以做为对象继承之间的转换: (答案是AB /B?)A.static_castB.dynamic_castC.const_castD.reinterpret_castC++标准定义了四个新的转换符:reinterpret_cast、static_cast、dynamic_cast和const_cast,目的在于控制类(class)之间的类型转换...原创 2019-03-07 09:38:55 · 432 阅读 · 0 评论 -
C++临时量
有时候,在求表达式值期间,编译器必须创建临时对象(temporary object)。像其他任何对象一样,他们需要存储空间,并且必须能够构造和销毁。区别是从来看不到它们(编译器负责决定他们的去留以及它们存在的细节)。但是关于临时量有这样一种情况:他们自动地成为常量。通常接触不到临时对象,改变临时量是错误的,因为这些信息应该是不可得的。编译器使所有的临时量自动地成为const,这样当程序员犯...原创 2019-03-11 11:06:52 · 223 阅读 · 0 评论 -
C++中的const和volatile详解/详解C++常量(3) 非常详细!!!!!!!!!
接下来我们开始介绍const用于类的两种办法。4.const与类 程序员可能想在一个类里建立一个局部const,将它用在常量表达式里,这个常数表达式在编译期间被求值。然而,const的意思在类里是不同的,所以为了创建类的const数据成员,必须了解这一选择。 还可以使整个对象作为const(编译器总是将临时类对象作为常量).但是,要保持类对象为常量却比较复杂。编译器能保证一个内...原创 2019-03-11 14:50:42 · 212 阅读 · 0 评论 -
【并行计算】基于OpenMP的并行编程(#pragma omp parallel for)
阅读SLAM代码时发现其中用到了一些OpenMP并行编程的知识,所以读了编不错的文章了解一下。转自:https://www.cnblogs.com/hantan2008/p/5961312.html我们目前的计算机都是基于冯偌伊曼结构的,在MIMD作为主要研究对象的系统中,分为两种类型:共享内存系统和分布式内存系统,之前我们介绍的基于MPI方式的并行计算编程是属于分布式内存系统的方...转载 2019-03-15 15:57:03 · 25449 阅读 · 3 评论 -
OpenMP并行程序设计——for循环并行化详解
阅读SLAM代码时发现其中用到了一些OpenMP并行编程的知识,所以读了编不错的文章了解一下。转自:http://blog.csdn.net/zhongkejingwang/article/details/40018735在C/C++中使用OpenMP优化代码方便又简单,代码中需要并行处理的往往是一些比较耗时的for循环,所以重点介绍一下OpenMP中for循环的应用。个人感觉只要掌握了文...转载 2019-03-15 16:00:33 · 1673 阅读 · 0 评论 -
C++11 STL中的容器总结
C++11 STL中的容器==================================================一、顺序容器:vector:可变大小数组;deque:双端队列;list:双向链表;forward_list:单向链表;array:固定大小数组;string:与vector相似的容器,但专门用于保存字符。================...原创 2019-03-12 14:32:34 · 75 阅读 · 0 评论 -
C++main函数及参数
转载自:https://www.cnblogs.com/carsonzhu/p/5276317.htmlC++ main()函数及其参数1、首先,想想C/C++在main函数之前和之后会做些什么?我们看看底层的汇编代码:__start: : init stack; init heap; open stdin; open stdou...转载 2019-03-27 10:09:55 · 8858 阅读 · 0 评论