c++ base
一个月可能改两次
这个作者很懒,什么都没留下…
展开
-
内存池链表逻辑
1.上一个链表节点的next指向下一个节点,当前的链表节点的next必须为空MemoryBlock* _pTempbefore = _pHeader;for (size_t i = 1; i < _nBlockSize; i++) { //第二块开始后开始储存数据 MemoryBlock* pTemp = (MemoryBlock*)(_pBuf + (i * (_nSize + sizeof(MemoryBlock)))); pTemp->bPool = true;原创 2021-03-29 21:22:57 · 120 阅读 · 0 评论 -
服务器收发分离
发送cell基类#ifndef _CELL_TASK_H_#include<thread>#include<mutex>#include<list>//快速增加删除任务#include<functional>#include<iostream>//任务类型-基类class CellTask{public: CellTask() { } virtual ~CellTask() { } virtual voi原创 2021-03-29 21:21:19 · 112 阅读 · 0 评论 -
内存池申请内存和释放内存
//申请内存 void *allocMem(size_t size) { //当内存池中可放下 if (size<=MAX_MEMORY_SIZE) { //szAlloc 是这个数据的大小,allocMemory是去分配这个数据 return _szAlloc[size]->allocMemory(size); } else//当内存池中不可以放下,就在其他地方开辟新内存 { MemoryBlock* pReturn = (MemoryBlock*原创 2021-03-29 21:20:55 · 158 阅读 · 0 评论 -
C++ : 引发了异常: 写入访问权限冲突。 this 是 nullptr
1.一般是初始化了参数,却没有给参数空间,查找问题,看构造里是否初始化,初始化的时候是否给了空间。特别是单例模式中,初始化一定要给空间。原创 2021-03-29 21:20:39 · 5060 阅读 · 0 评论 -
共享指针usecount
std::shared_ptr<aa>b = std::make_shared<aa>(); std::shared_ptr<aa>c = b; std::cout << "c use count" << c.use_count() << std::endl; std::cout << "b use count" << b.use_count() << std::endl;输出 c.use.原创 2021-03-29 21:17:27 · 417 阅读 · 0 评论 -
for 循环中不能使用size_t 做减减
size_t i = -5; size_t a = -1; std::cout << i << " ...."<<a<<std::endl;如若是if(size_t i = a ;i<=0;i++)当真的计算到 i=-1的时候就跳转到4294 造成死循环原创 2021-03-10 17:57:12 · 287 阅读 · 0 评论 -
如何使用vs2019 查看函数消耗cpu的效率
1.正常开发过程中,当我们实现整体工程,或者一个模块功能后,我们需要进一步优化这个模块的效率。这时我们就需要使用vs中的性能探测器,主要帮我我们检测各个函数在整个程序运行时占cpu的比率。2.如何使用。1.将我们要检测的项目设置为启动项,使用alt+F2 打开性能探测器。这时最好将项目设置为release。这时会运行项目。项目运行结束后,会有一个项目分析报告,排在越前面,占CPU比率越高的,我们就应该去优化。点击函数,跳转到函数报告。这时我们就可以看见在这个函数中,哪个函数占CPU得运算效率原创 2021-03-09 16:56:55 · 4938 阅读 · 0 评论 -
多线程数组的两种写法
1.将线程分组std::thread t1(cmdThread); t1.detach(); std:: thread t2[tCount]; for (size_t i = 0; i < tCount; i++) { t2[i] = std::thread(sendThread, i + 1); } for (size_t i = 0; i < tCount; i++) { t2[i].detach(); }2.创建相同线程对向名 仍然可以运行,不知道为什么,有原创 2021-03-09 15:55:28 · 145 阅读 · 0 评论 -
在vs下如何看C++汇编语言
1.先给程序打断点2.右击想看的汇编操作点击转到反汇编,就可以看见汇编3.查看汇编语言原创 2021-03-09 10:15:22 · 1384 阅读 · 0 评论 -
sizeof 和 auto的用法
1.当你想传输一个结构体,却不知道他多长的时候,可以直接带编译前使用int a =sizeof(结构体)看看这个结构体的长度2.当你不知道一个返回对象的类型的时候可以使用auto a = 对象;来查看这个对象的类型...原创 2021-03-08 10:33:53 · 108 阅读 · 0 评论 -
如何写好一个.h头文件
//1.先要声明命名空间namespace pcl{ /** \brief @b Registration represents the base registration class for general purpose, ICP-like methods. * \author Radu B. Rusu, Michael Dixon * \ingroup registration *///2.创建模板类子类 template <typename PointSo原创 2021-03-05 16:41:10 · 218 阅读 · 0 评论 -
boost智能指针与vector
一.以PCL点云库为例子typedef pcl::PointCloud<PointT> PointCloud;typedef typename PointCloud::Ptr PointCloudPtr;typedef typename PointCloud::ConstPtr PointCloudConstPtr;//使用typedef的原因, 因为shared_ptr是个模板类,typedef起标示作用C++20之前都得声明typedef boost::shared_ptr <原创 2021-03-05 16:21:32 · 453 阅读 · 0 评论 -
无法解析的外部符号 “public: __thiscall EasyTcpServer::EasyTcpServer(void)“ (??0EasyTcpServer@@QAE@XZ),函数 _mai
问题:无法解析的外部符号 "public: __thiscall EasyTcpServer::EasyTcpServer(void)" (??0EasyTcpServer@@QAE@XZ),函数 _main 中引用了该符号原因没有定义类中的构造函数,也就是构造函数没有加“{}”。cpp文件是不能被引用的。...原创 2021-03-01 21:41:19 · 169 阅读 · 0 评论 -
++i , i++
#include<iostream>using namespace std;int main(){ int array_[5] = { 1,2,3,4,5 }; int i = 0; cout << "i++" << array_[i++] << endl; cout << "i after i++ " << i << endl; i = 0; cout << "++i" << a原创 2021-02-25 10:01:03 · 52 阅读 · 0 评论 -
C++面试体汇总
1.已知memcpy的函数为: void* memcpy(void dest , const void src , size_t count)其中dest是目的指针,src是源指针。不调用c++/c的memcpy库函数,请编写memcpy。void* memcpy(void *dst, const void *src, size_t count) { //安全检查 assert( (dst != NULL) && (src != NULL) ); uns原创 2021-02-24 10:25:30 · 57 阅读 · 0 评论 -
C++编码规范
写一个C++编码规范,想到什么写什么,大家如果有想法欢迎评论交流。1.什么时候用inline 内联函数当使用set,get这样短的,执行效率快的函数使用内敛。剩下的可以不用使用内联2.函数注释怎么加/** \brief 介绍函数* \return return_varaible 介绍返回什么值* \param param_name 介绍传入变量* /3.类成员变量明明在成员变量后面加 " _ " 表示这是成员变量。int a_;char b_;...原创 2021-02-24 09:55:37 · 86 阅读 · 0 评论 -
Using typename的理解
我们经常在写一个子类去继承另一个父类的时候,会看到有人使用using functionname= typename namespace::classname<template>::classfunctionname;using InputKdTree=typename pcl::Registration<PointSource,PointTarget>::KdTree;using的作用:当你想要去调用继承类中的已经写好的成员函数的时候,可以使用using给这个函数在你的子函原创 2021-02-23 09:20:49 · 2129 阅读 · 0 评论 -
特征值分解与奇异值分解SVD
https://www.imooc.com/article/267351?block_id=tuijian_wz先看这篇文章。1.什么是矩阵一件事情,有多个纬度影响。就像球员卡的各项指标影响一个球员的表现一样。一个指标就是一个维度。比如一个球员跑的快,那这场比赛里面总体跑动的几率多于总体射门的几率。那这个球员这场表选在整队里应该是最突出的。而一场比赛射门的几率多余跑动的几率,那么射门能力强的球员这场比赛的表现能力是强于跑的快的球员的。一个球员有多个纬度,跑动的能力,射门的能力,防守的能力,传球的原创 2021-02-04 09:59:31 · 102 阅读 · 1 评论 -
C++读取一个文件下所有文件
读取所有文件#include<iostream>#include<string>#include<vector>#include<io.h>using namespace std;void getFiles(string path, vector<string>&files){ //文件句柄 //千万不要用long,运行的时候会暴内存异常 要用intptr_t intptr_t hFile = 0; //文件信息 s原创 2021-01-30 18:20:00 · 332 阅读 · 0 评论 -
Enable if
//使用了enable_if,也就是如果有aligned_allocator 类型就用aligned_allocator 类型,如果没有那就输入matrix4f到vector中 std::vector<Eigen::Matrix4f, Eigen::aligned_allocator<Eigen::Matrix4f>>rototranslations; template<class _Iter, class = enable_if_t<_Is_iterator原创 2021-01-25 18:09:40 · 84 阅读 · 0 评论 -
.h和.cpp以及namespace
1.当你要写一个类的时候,将类的声明 和头文件 define 的声明放在.h里。将类的实现放在.cpp,只需要囊括相应的.h文件就行。但是.h和cpp都应囊括到一个namespace中。https://github.com/cartographer-project/cartographer/tree/master/cartographer/commoncommon里的cpp 和 h文件对应的都是一个类2.当你只需要实现一个函数而不用写一个类时,将函数实现写在.hpp中,也要在namespace中。然原创 2021-01-22 14:42:40 · 750 阅读 · 0 评论 -
cloud compare和 pcl读取点云因为viewpoint 配准不上
pcd的默认viewpoint是 0,0,0,1,0,0,0而在cloudcompare 处理过后的iewpoint会改变,而每片点云的viewpoint都不一样所以会造成点云配准失败。针对CloudCompare软件处理过的pcd格式点云,在使用PCL进行特征点提取、配准等实验中最终显示结果出现点云位置偏差较大的问题,本博客给出解决方案。PCL处理的pcd格式点云数据,默认视点为:VIEWPOINT 0 0 0 1 0 0 0经CloudCompare软件处理过的pcd格式点云数据,保存后的视点为:原创 2021-01-20 17:27:43 · 1939 阅读 · 2 评论 -
输出的string前面的有“?”
原创 2021-01-08 13:43:22 · 131 阅读 · 0 评论 -
C++把一个文件下的所有文件遍历到一个数组里
void FindAllFile(CString path, CString* filenames, int& count){ CFileFind finder; BOOL working = finder.FindFile(path + "\\*.*"); while (working) { working = finder.FindNextFileW(); if (finder.IsDots()) { continue; } else if (finder..原创 2021-01-06 17:10:46 · 259 阅读 · 0 评论 -
关于OpenCV与OpenCV_Contrib
今天想跑个代码发现安装了windows的OpenCV竟然还缺少库,在链接库当中,尝试了在属性附加依赖项当中取消从父级或者项目默认中继承和手动添加继承值的库(把opencv_aruco341修改添加到附加依赖项中),这两个操作依然无效。其实问题就是OpenCV,把一些不稳定的库剔除了,只保留稳定的基本库。其实继承的库都是contrib中。参考操作文章:https://blog.csdn.net/weijifen000/article/details/93377143...原创 2020-12-05 17:26:57 · 807 阅读 · 0 评论 -
结构体,函数,类偏移量
1.结构体偏移量struct Test{ int a;//4byte int b;//4byte int c; int d; } //a->d 低到高//这俩在内存中的结构是一样的Test test;int arrtest[4];//int Test::*memoffset=&Test::a;cout<<"Show the offset"<<endl;printf("a's offset %u \n",memoffset);//对照tes原创 2020-11-06 14:34:12 · 104 阅读 · 0 评论 -
CMAKE使用
1.工程文件目录-include-src-build-CMakeLists.txt2.cmakelists.txtCMAKE_MINIMUM_REQUIRED(VERSION 3.10) #CMAKE的最小版本PRIJECT(myproject) #生成的项目你想取啥名AUX_SOURCE_DIRECTORY(src/ DIR_SRCS)#搜索src目录下的所有cpp文件,取名DIR_SRCS作为下面的添加路径ADD_EXECUTABLE(myproject ${DIR_SRCS})#取原创 2020-10-19 23:00:03 · 60 阅读 · 0 评论 -
智能指针
一.C++特性,程序员需要对自己申请的动态空间内存负责JAVA&PYTHON有自己的垃圾回收器,不需要人为管理。普通操作int main(){ //通过new,在堆上分配了四个字节的空间 int *p=new int; return 0;}封装操作//创建内存资源封装void * alloc_data(){ int *p=new int;}//文件资源FILE* open_file(char* name){ FILE* fp=NULL; fp= fopen(n原创 2020-10-11 22:44:26 · 71 阅读 · 0 评论 -
线程池
一:C++都有什么池?线程池,内存池,数据库连接池,请求池,消息队列(消息池),对象池.池的作用就是用来处理缓存数据,缓冲区。二:说一说线程池作用1.解决任务处理2.解决阻塞IO3.解决线程创建与销毁的成本问题4.管理线程5.异步解耦(例:服务器日志书写,磁盘书写速度远小于内存,所以若果把日志写在磁盘上,高并发时,性能就会收到磁盘书写速度的牵制,线程池的异步解耦能力解决。)三:线程池的实现组成:1.执行队列,线程们2.任务队列,任务们3.管理组件不同线程的共有资源就是任务队列,任原创 2020-09-27 15:27:54 · 65 阅读 · 0 评论 -
std::launch::async和std::thread的不同之处
一.std::thread 和 std::launch::async对不同之处1.thread我们在调用thread函数语句时,直接会在主线程中创建一个线程。但是如果系统资源紧张,线程创建就会失败,执行thread()函数时整个程序可能会崩溃。std::thread t1(gatewayFunction,paraofFunction);2.async与deferred而std::launch::async是创建一个异步任务,因为有时候async并不创建新线程,需要在调用该任务时,入口函数才会执原创 2020-09-24 10:43:37 · 444 阅读 · 0 评论 -
Enum and Euma Class
1.EnumEnum Day{Mon=1,Tus,Wen,Thu,Fri,Sat,Sun};//Day 枚举名(域名)Enum Day day;//Day的对象名day=mon;//day=1;++day;//1+1cout<<day<<endl;//cout 2//////////////////////////////////////////////////////Enum Day{Mon=6,Tus,Wen,Thu,Fri,Sat,Sun} day;//定义对象名原创 2020-09-16 23:05:23 · 63 阅读 · 0 评论 -
std::future的share & atomic 操作用来处理多线程获取,写入共享数据
1.std::futureint mythread(){cout<<"mythread starat ,ThreadID is"<<std::this_thread::get_id()<<endl;std::chrono::millseconds dura(5000);std::this_thread::sleep_for(dura);cout<<"mythread end,ThreadID is<<std::this_thread::原创 2020-09-16 22:21:58 · 199 阅读 · 0 评论 -
异步任务std::async,std::future,std::packaged_task
1.packaged_task:打包函数线程int mythread(int mypar)//The entrance function of thread { cout << "mypar is " << mypar << endl; cout << " mythread() is runing,threadID is: " << this_thread::get_id() << endl; chrono::millisec原创 2020-09-12 11:14:07 · 139 阅读 · 0 评论 -
c++多线程唤醒notify_all与notify_one
*///单例设计模式:/*整个程序中某个或者某些特殊的类,他们只能创建一个对象(一般为数据共享)。单例类,只能生成一个对向。设计模式共享数据问题分析,解决如果数据是只读的,多个线程同时调用没有问题,所以单例一般适合在只读数据上使用。一般单例用来储存全局唯一变量。例如银行的货币的汇率。建议:在创建其他线程之前,在主线程中就把单例的成员初始化和数据装载。*///在子线程中创建单例/*面临问题:需要在我们自己创建的线程中创建MYCAS这个单例类对象,这样的线程最少两个、所以GetInst原创 2020-08-23 13:48:24 · 2134 阅读 · 0 评论 -
单例模式与call_once
//Design Pattern/*1.程序灵活,维护方便,但是接管难2.适用于大项目,不要生搬硬套*///单例设计模式:/*整个程序中某个或者某些特殊的类,他们只能创建一个对象(一般为数据共享)。单例类,只能生成一个对向。设计模式共享数据问题分析,解决如果数据是只读的,多个线程同时调用没有问题,所以单例一般适合在只读数据上使用。一般单例用来储存全局唯一变量。例如银行的货币的汇率。建议:在创建其他线程之前,在主线程中就把单例的成员初始化和数据装载。*///在子线程中创建单例/*原创 2020-08-18 11:45:35 · 262 阅读 · 0 评论 -
unique_lock
//一.unique_lock取代lock_guard//unique_lock 是个类模板,工作中,一般lock_guard(推荐使用);lock_guard 取代了lock()和unlock()//unique_lock 比lock_guard 灵活很多;效率上差一点,内存占用多一点。//二.unique_lock的第二个参数://2.1:std::adopt_lock:起标记作用,表示这个互斥量已经被lock了(所以必去把互斥量提前lock了,否则会报异常)//2.2:std::try_to原创 2020-08-16 12:06:01 · 131 阅读 · 0 评论 -
死锁问题和解决方法+lock()函数
//死锁,两个锁(两个互斥量),被两个线程按乱序使用导致死锁,跟解锁顺序无关//死锁的解决办法一:保证两个互斥量上锁的顺序一致就不会死锁。//解决方法二:std::lock()函数,一次锁住两个或两个以上的互斥量(至少两个,多了不限,1个不行);//要么两个互斥量都锁住,要么两个互斥量都没锁住。如果只锁了一个,另外一个没锁成功,则它立即把已经锁住的互斥量解锁。#include<iostream>#include<thread>#include<vector>原创 2020-08-12 17:25:50 · 604 阅读 · 0 评论 -
多线程metex互斥量与lock_guard
//保护共享数据,防止多线程误操作,删除数据//原则:对共享数据对象使用互斥锁(mutex),锁定数据,只让一方操作数据,坚持读写分离(只写不读,只读不写)//lock 和 unlock 要成对使用//锁定的代码越少执行的越快,所以可以剥离一些模块成为函数,直接锁定这个函数//防止大家忘记添加unlock(),引入了一个std::lock_guard的类模板:你忘记unlock,它替你unlock//lock_guard直接取代了lock()和unlock()。使用了lock_guard ,就不能原创 2020-08-12 13:39:48 · 203 阅读 · 0 评论 -
C++多线程与智能指针
/**Definition:*Author:*Date:*/#include<iostream>#include<thread>#include <memory>//智能指针头文件using namespace std;class A{ mutable int m_i;public: mutable int test_i;//mutable 无论在哪都可以修改 test_i的值 A(){}//g构建一个int类型的类A A(int a):m原创 2020-07-26 16:33:33 · 580 阅读 · 0 评论 -
C++ 二维数组
/**Definition:*Author:*Date:*/#include <iostream>#include <array>#include <vector>using namespace std;//Static arrayint a[4][5] ={ { 1, 2, 3, 4, 5 },{ 6, 7, 8, 9, 10 },{ 11, 12, 13, 14, 15 },{ 16, 17, 18, 19, 20 } };void原创 2020-07-21 18:57:52 · 151 阅读 · 0 评论