![](https://img-blog.csdnimg.cn/2021052813360876.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
CPP
文章平均质量分 83
C++
SOC罗三炮
嵌入式软件开发,ARM CPU架构研究,某厂芯片SOC系统验证工程师
展开
-
开源,点云处理及三维重建软件(Point Cloud Viewer, PCV)的设计与实现
本文所设计的点云处理及三维重建软件主要基于Microsoft Visual Studio 2017以及Qt Creator两个集成开发环境,来完成代码的编写、分析、编译以及调试工作。此外,本文主要基于Qt框架来完成软件界面的设计以及内部逻辑功能的实现,Qt具有一套代码,多平台运行的特点,因此使用此框架开发的软件不仅能够在Windows和Linux等操作系统上运行,还能在MacOS上运行。也正是因为Qt的跨平台开发的特性,也使得本章所设计的软件可以在多个操作系统中正常运行。原创 2023-04-22 18:39:10 · 20152 阅读 · 57 评论 -
Qt开源项目:校医院远程诊断系统介绍
本人研一参考技术书籍开发的一款Qt程序,两年前已上传到GitHub,有兴趣的同学可以去看看。可能之前上传的项目不够完整,导致有一些同学没有在自己的环境上跑通,所以今天将整个工程都重新上传一遍,包括使用到的opencv的动态链接库。原创 2023-04-21 23:09:12 · 6512 阅读 · 4 评论 -
【C++面试宝典】C/C++知识点补充
目录C++补充补充知识语言对比C和C++Java和C++Python和C++C和C++中struct判断结构体是否相等可变参数模板switch中case里不能自定义变量char和int转换malloc的底层实现C语言检索内存情况异常处理try/catchfork()epollC/C++C语言补充printfswitch动态内存管理malloc函数realloc函数calloc函数...原创 2022-01-11 00:00:00 · 2288 阅读 · 0 评论 -
【C++面试宝典】C/C++编译底层知识总结
目录编译底层内存对齐内存管理堆栈代码区全局/静态存储区常量存储区内存碎片编译流程预编译(预处理)编译汇编链接include头文件双引号""和尖括号<>的区别库静态库动态库重载的底层原理虚拟内存VM大小端定义及判断C++程序组成编译内存相关内存泄漏定义分类如何防止内存泄漏检测检测原理后果使用new、delete常见问题段错误 编译底层...原创 2022-01-09 10:00:00 · 1363 阅读 · 0 评论 -
【C++面试宝典】C++11新特性知识总结
C++11新特性 auto自动类型推导 用于初始化表达式中推断出变量的数据类型 auto a;//错误,应该是auto i=1; 最常见用在迭代器vector<int>::iterator it = v.begin();auto it = v.begin(); 基于范围的for循环:for(auto x: str){...} 使用限制 auto的使用必须马上初始化,否则无法推导类型 auto a; ...原创 2022-01-08 09:00:00 · 1788 阅读 · 0 评论 -
【C++面试宝典】C++STL知识点总结
容器、迭代器、算法 实现对多个类型的数据结构和相关操作 序列容器 序列容器未排序 vector 底层数据结构为数组 支持快速随机访问 可以使用== ,!= 比较是否相等 vector底层机...原创 2022-01-07 18:48:13 · 1270 阅读 · 0 评论 -
【C++面试宝典】C++面向对象知识点总结
本文为博主准备C++面试所总结归纳的C++面向对象知识点,原文件为脑图形式,见下图。下文则是将知识点脑图转为文字形式的结果,便于读者总结归纳。目录面向过程和面向对象用C 实现 C++ 的面向对象特性双冒号、using和namespace对象的引用方式类默认的六个成员函数const成员构造函数拷贝构造函数深拷贝与浅拷贝析构函数封装this指针静态成员友元重载(overload)、覆盖(overwrite)和重定义继承多态虚函数模.原创 2022-01-07 10:28:26 · 2587 阅读 · 0 评论 -
【C++面试宝典】C++基础知识总结
博主精心总结的C++技术面试基础知识,原文件为脑图,见下图。文字版由脑图文件直接转换而成,所以格式上略显粗糙。基础知识 数组与指针 概念 数组 数组是用于存储多个相同类型数据的集合 指针 指针是一个变量,这个变量存储的事另一个变量的地址(十六进制数) 关系 使用数组作为参数传递时,数组名将退化为指针,指针指向数组首元素的地址 指针数组 存放指针变量的数组,int * arr[8] ...原创 2022-01-06 20:50:58 · 1531 阅读 · 0 评论 -
使用CMake+Visual Studio编译生成的项目出现无法启动程序的问题解决办法
PCL的项目编译生成使用CMake配合VS使用是目前最便捷的方法。一般步骤如下:编写CMakeLists.txt和cpp文件 使用Cmake进行项目生成 使用VS打开项目使用VS打开CMake生成的sln文件后,可以看到三个项目:中间的pcl_visualizer_demo是我的工程文件,另外两个是CMake附带生成的,点击运行,会报错:出现这个问题其实解决办法很简单:因为当前默认的启动项目是ALL_BUILD这个项目,而不是自己的,所以只要将pc...原创 2021-07-18 21:30:28 · 8885 阅读 · 5 评论 -
C语言简单判断是大端还是小端(字节序)以及网络字节序
大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。 小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。简单来说,就是:小端——低地址存储低位,高地址存储高位 大端——低地址存储高位,高地址存储低位判断原理:使用..原创 2021-05-26 11:00:02 · 1980 阅读 · 0 评论 -
C++vector等容器使用push_back和emplace_back的区别
http://c.biancheng.net/view/6826.html原创 2021-05-11 19:28:07 · 4618 阅读 · 2 评论 -
C++左值、右值、左值引用、右值引用
#include <iostream>#include <vector>#include <string>#include<utility>using namespace std;class A{public: A() { a = 666; cout << "构造A" << endl; } A(const A&a) { cout << "拷贝构造A" << endl;.转载 2021-05-10 20:31:53 · 2359 阅读 · 2 评论 -
在 1G 内存的计算机中能否 malloc(1.2G)
作者:牛客192239号链接:https://www.nowcoder.com/discuss/20610?type=0&order=0&pos=6&page=1来源:牛客网问题:在 1G 内存的计算机中能否 malloc(1.2G) ?为什么?【解答要点】:malloc能够申请的空间大小与物理内存的大小没有直接关系,仅与程序的虚拟地址空间相关。程序运行时,堆空间只是程序向操作系统申请划出来的一大块虚拟地址空间。应用程序通过malloc申请空间,得到的是在虚拟地址空.转载 2021-05-09 18:12:20 · 1455 阅读 · 4 评论 -
C++智能指针shared_ptr、unique_ptr以及weak_ptr
使用智能指针的目的:为了更容易更安全的使用动态内存智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。新标准库提供的两个智能指针shared_ptr和unique_ptr的区别在于管理底层指针的方式:shared_ptr允许多个指针指向同一个对象 unique_ptr则“独占”所指向的对象 weak_ptr则是一种弱引用,指向shared_ptr所管理的对象shared_ptr类智能指针也是模板,所以在创建一个智能指针时,必须提供指针指向的类型:shared...原创 2021-04-27 10:59:08 · 5557 阅读 · 3 评论 -
从放苹果问题到零钱兑换问题(动态规划)
放苹果问题题目描述把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1是同一种分法。数据范围:0<=m<=10,1<=n<=10。输入描述:输入两个int整数输出描述:输出结果,int型示例1输入:7 3输出:8举例:总结:m=0,没有苹果,所有盘子空着,一种放法,即f(0,n) = 1; n=0,没有盘子,没办法放,即f(m,...原创 2021-04-25 11:20:22 · 358 阅读 · 0 评论 -
C++四则运算字符串解析(附动图以及动图制作方法)
算法动态演示的演示图一般是怎么制作的,PPThttps://juejin.cn/post/6844903749203263501https://github.com/MisterBooo/Play-With-Sort-OChttps://www.screentogif.com/原创 2021-04-05 15:42:47 · 3381 阅读 · 1 评论 -
C++中内联函数和宏定义
内联函数C++内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字inline,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline 限定符。它能修饰任意函数,此关键字是一个建议,告诉编译器应该把此函数实现为内联..原创 2021-04-01 17:00:16 · 458 阅读 · 1 评论 -
C/C++计算类/结构体和联合体(union)所占内存大小(内存对齐问题)
同学可以尝试将char f 注释,最后将得到24,也可以从侧面说明再加上一个char f,其大小肯定大于等于24 byte。Test3中的最大数据成员大小比成员结构体Test内部最大成员大小要小,这时规则3是按照。sizeof的大小是24,即满足容下a[20],同样24是b、c和d的倍数,规则3。sizeof的大小是20,即a[20]的大小,同样20是b和c的倍数,规则3。s中char ch1;占用 1Byte(存储位置8)的,sizeof的结果是40。最大元素大小的整数倍地址。原创 2021-04-01 15:01:57 · 8390 阅读 · 27 评论 -
C++堆排序的原理及实现
首先回顾下堆的数据结构的特点:堆的描述堆是一颗二叉树,这样的二叉树是局部有序的,任何节点与其兄弟节点之间都没有必然的顺序联系,但是它与父子节点之间有大小顺序关系,按照关系的不同,分为最大值堆和最小值堆:最大值堆:子节点比父节点小的堆,根节点是树中最大的节点。 最小值堆:子节点比父节点大的堆,根节点是树中最小的节点。堆是左平衡的树,所以随着节点的增加,树会逐级从左至右增长。因此对于一个堆来说,一个比较好的表示左平衡二叉树的方式是:将节点通过水平遍历的方式连续存储到一个数组中。假设有一个零原创 2021-03-31 15:55:30 · 3219 阅读 · 3 评论 -
C/C++保留指定小数位数输出和取整方式
#原创 2021-03-29 23:08:41 · 11829 阅读 · 0 评论 -
C/C++字符串输入输出和字符串函数基础学习
字符串常量(字符串字面量)用双括号括起来的内容称为字符串字面量,也叫做字符串常量。属于静态存储类别,如果在函数中使用字符串常量,该字符串只会被储存一次,在整个程序的生命周期内存在,计时函数被调用多次。**被双引号括起来的内容被视为指向该字符串储存位置的指针。/* 输出结果: We, 0000000000404000, t 根据%s打印出We,根据%p转换说明打印出一个地址,因此"are"代表一个地址 最后,*"the best"表示字符串所指向地址时储存的值,为该字符串的首字母 t */原创 2020-09-16 14:49:43 · 2286 阅读 · 0 评论 -
C++中vector的底层机制以及size和capacity的区别
vector底层机制vector可以看做是一个动态的数组,是一段连续的线性内存空间。它使用3个迭代器来表示://_Alloc 表示内存分配器,此参数几乎不需要我们关心template <class _Ty, class _Alloc = allocator<_Ty>>class vector{ ...protected: pointer _Myfirst; pointer _Mylast; pointer _Myend;};.原创 2021-03-29 14:41:17 · 2645 阅读 · 0 评论 -
C++七种序列容器详解
1,vector-向量vector模板类是最简单的序列类型,除非其他类型的特殊优点能更好地满足需求,否则应默认使用vector。底层数据结构为数组自动内存管理 随机访问元素 在尾部插入或删除元素,固定时间–O(1) 在头部插入和删除元素,线性时间—O(n) 可反转容器(rbegin(),rend())member functions:vector::assign vector::at vector::back vector::begin vector::capacity原创 2021-03-29 10:38:29 · 599 阅读 · 0 评论 -
C++中自加(i++/++i)自减(i--/--i)运算符效率分析
结论:优先使用 ++i 和 --i 以提高运行效率虽然大家都知道 i++/i-- 是先使用再自加减,而 ++i/--i 则是先自加减再使用首先回顾下:C++中自加自减运算符的重载自增运算符++、自减运算符--都可以被重载,但是它们有前置、后置之分。以++为例,假设 obj 是一个 CDemo 类的对象,++obj和obj++本应该是不一样的,前者的返回值应该是 obj 被修改后的值,而后者的返回值应该是 obj 被修改前的值。如果如下重载++运算符:CDemo & CDemo原创 2021-03-21 11:21:47 · 1352 阅读 · 0 评论 -
C/C++加减乘除运算效率分析
运算效率移位 > 赋值 > 大小比较 > 加法 > 减法 > 乘法 > 取模 > 除法。使用移位来代替乘除法,提高运算效率 int a = 64; cout << "a / 2 = " << (a >> 1) << endl; cout << "a / 4 = " << (a >> 2) << endl; cout << "a / 8原创 2021-03-21 10:09:36 · 10144 阅读 · 0 评论 -
C/C++中static关键字用法
静态变量的意思是:该变量在内存中的地址不变,并不是说它的值不变。- 静态变量和自动变量一样,具有块作用域、无链接,但是具有静态存储期,当程序离开它们所在的函数后,静态变量不会消失,- 不能在函数形参中使用static,如int test(static int flu );//不允许静态全局变量在全局变量之前加上关键字static,该全局变量就被定义成了一个静态全局变量特别注意:1.静态全局变量在内存中的存储位置:静态区(全局区)。[注]:静态区(全局区)在整个程序运行期间都存...原创 2021-03-11 22:52:15 · 709 阅读 · 0 评论 -
C++函数指针和指针函数
指针函数:一个返回指针的函数,本质是一个函数,返回的变量为指针类型。这里不做赘述。主要讲函数指针的概念与运用。函数指针定义本质为一个指针变量,这个指针指向一个函数的内存空间。每一个函数都占用一段内存单元(函数存放在代码区,同一个类的不同对象共用成员函数内存空间;inline(内联)函数也一样,它只是在调用函数的时候将函数代码复制到函数调用点),它们有一个起始地址,指向函数入口地址的指针称为函数指针。函数的地址就是函数名,要将函数作为参数进行传递,必须传递函数名。语法指向函数的指针原创 2021-03-09 23:25:30 · 570 阅读 · 0 评论 -
C/C++数组和指针学习总结
指针是一个存储内存地址的变量(或数据对象)与指针相关的运算符地址运算符 &后跟一个变量名时,&给出该变量的地址。&a表示变量a的地址地址运算符 *后跟一个指针名或地址时,* 给出存储在指针地址上的值。*b=a;//表示把a指向的地址上的值赋给b。声明指针声明指针变量时,必须指定指针所指向变量的类型,因为不同的变量类型占用不同的存储空间。一些指针操作需要知道操作对象的大小。另外,程序必须知道储存在指定地址上的数据类型。int * pi;//pi是指向int类型变原创 2020-09-13 20:21:16 · 483 阅读 · 1 评论 -
C/C++位操作、位运算
在C语言中,可以单独操控变量的位(bit),一般高级语言不会处理这级别的细节,C在提供高级语言便利的同时,还能为汇编语言所保留的级别上工作,这使其成为编写设备驱动程序和嵌入式代码的首选语言。二进制整数(binary) 通常,1字节包含8位,C语言用**字节**(byte)表示储存系统字符集所需的大小,从左往右,分别给这8位分别编号7~0,在一字节中,编号是7的位被称为高阶位,编号为0的位被称为低阶位。该字节能表达的最大数字:1111 1111,为255,最小值为:0000 0000,为0,所..原创 2021-03-07 22:15:58 · 9219 阅读 · 2 评论 -
C++类型转换:隐式转换和显式转换
隐式转换当一个值拷贝给另一个兼容类型的值时,隐式转换会自动进行。所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为。例如:short a=2000;int b;b=a;在这里,a在没有任何显示操作符的干预下,由short类型转换为int类型。这就是标准转换,标准转换将影响基本数据类型,并允许数字类型之间的转换(short到int, int到float, double到int…),到bool或从bool,以及一些指针转换。对于非基本类型,数组和函数隐式地转换为指针,并且指原创 2020-12-30 20:07:09 · 17248 阅读 · 4 评论 -
C++运行阶段类型识别(Runtime Type Identification)(C++新特性)
编译时开销编译器在编译代码时,主要进行:词法分析(识别单词,确认词类:标识符、关键字、字符串、数字等等)、语法分析(识别短语和句型的语法属性,生成语法树)、语义分析(确认单词,句型的语义特征,如加减乘除等)、代码优化和代码生成等。模板、类层次结构、强制类型检查等新特性,以及大量使用了这些新特性的STL标准库都增加了编译器负担。运行时开销C++中有可能引入额外运行时开销的新特性包括:虚基类 虚函数 RTTI(dynamic_cast和typeid) 异常 对象的构造和析构RTTI原创 2020-12-30 15:54:50 · 1677 阅读 · 4 评论 -
C/C++预编译、编译、汇编和链接四个过程
目录一,预编译(预处理Preproceessing)二,编译(Compilation)词法分析语法分析语义分析代码优化代码生成三、汇编(Assembly)四、链接(Linking)C/C++编程的基本策略:用程序将源代码文件转换为可执行文件(其中包含可直接运行的机器语言代码)典型的C实现通过编译和链接两个步骤来完成。编译器把源代码转化成中间代码 链接器把中间代码和其他代码合并,生成可执行文件编译链接过程要细分的话要分解4个步骤:预处理、编译...原创 2020-12-15 21:15:59 · 3159 阅读 · 0 评论 -
C++类模板tuple(元组C++11)和pair的简单使用
tuple(元组)定义于头文件<tuple>,C++11特性;简介tuple是一个固定大小的异类值汇集,也就是说tuple是一个固定大小的不同类型值的集合,是泛化的std::pair。我们也可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观。std::tuple理论上可以有无数个任意类型的成员变量,而std::pair只能是2个成员,因此在需要保存3个及以上的数据时就需要使用tuple元组了。等价结构体str.原创 2020-12-15 16:17:51 · 701 阅读 · 0 评论 -
C++引用变量、函数中引用参数&、引用和指针的区别
引用是充当另一个变量别名的变量。引用类型最常用于函数的参数,它使得一个函数能够对传递给他的变量做出永久性的改变。引用更正确的称呼是左值引用。#include <iostream>using std::cout;using std::cin;using std::endl;int add(int &a);int main(void) { int a = 11, b = 22; int i = 0; int &j = i;//j是i的一个别名 j++;//更改i原创 2020-10-13 10:34:47 · 1283 阅读 · 0 评论 -
C++类的前置声明和头文件包含
一、类嵌套的疑问C++头文件重复包含实在是一个令人头痛的问题,假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:class B;class A{ public: B b;};class B{ public: A a;};因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的,在这里我们只需要把其中的一个A转载 2020-12-09 21:25:47 · 1595 阅读 · 0 评论 -
C++中类所占的内存大小以及成员函数的存储位置
类所占内存的大小是由成员变量(静态变量除外)决定的,虚函数指针和虚基类指针也属于数据部分,成员函数是不计算在内的。因为在编译器处理后,成员变量和成员函数是分离的。成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现原创 2020-12-06 16:36:10 · 14872 阅读 · 17 评论 -
C/C++中的内存对齐问题
内存对齐的三条规则数据成员对齐规则,结构体(struct)(或联合(union))的数据成员,第一个数据成员存放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员(只要该成员有子成员,比如数组、结构体等)大小的整数倍开始(如:int 在 64bit 目标平台下占用 4Byte,则要从4的整数倍地址开始存储)结构体作为成员,如果一个结构体里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储结构体的总大小,即sizeof的结果,必须是其内部最大成转载 2020-12-06 16:06:05 · 421 阅读 · 1 评论 -
C++中类(class)和结构(struct)的区别
类描述看上去很像包含成员函数以及public和private可见性标签的结构声明,实际上,C++对结构进行了扩展,使之具有与类相同的特性。它们之间的唯一区别是:结构的默认访问类型是public,而类的默认访问类型为private。在C++中通常使用类来实现类描述,而把结构限制为只表示纯粹的数据对象(常被称为普通老数据POD(Plain Old Data)结构,)。C和C++中结构体的不同:C语言中的结构体不能为空,否则会报错C语言中的结构体只涉及到数据结构,而不涉及到算法,也就是说在C中数据结构和算原创 2020-12-06 15:00:14 · 11314 阅读 · 7 评论 -
C/C++中操作符sizeof和函数strlen()的区别
对于字符串,sizeof关注的是字符串所占的空间,strlen关注的是字符串的实际长度。strlen(char*)函数求的是字符串的实际长度,直到遇到第一个’\0’,然后就返回计数值,且不包括’\0’。1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。2.sizeof是算符,strlen是函数。3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’’\0’'结尾的。原创 2020-12-05 11:27:49 · 635 阅读 · 0 评论 -
C++中new/delete和malloc/free的区别和联系
类型不同new/delete是C++中的操作符,它调用的分别为赋值运算符重载operator new()和operator delete();void *operator new(size_t); //allocate an objectvoid *operator delete(void *); //free an objectvoid *operator new[](size_t); //allocate an arrayvoid *operator delete[](原创 2020-12-05 10:36:06 · 357 阅读 · 1 评论