C++
文章平均质量分 52
Ning静致远
不言成败,只看成长,做一名终生成长者!
展开
-
nginx-MD5算法实现
MD5加密算法,也叫信息摘要算法,在项目中经常用到,一直对其原理比较好奇,在学习nginx源码的过程中,发现有其实现,就单独拿出来,进行调试学习,对于理解其原理非常有帮助。md5.h文件md5.cpp测试💖 原理网上的总结很多,可以结合源码学习和理解。参考:原创 2022-11-10 21:46:30 · 1618 阅读 · 1 评论 -
libcurl库
libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。原创 2022-08-29 22:46:22 · 580 阅读 · 0 评论 -
C++ 互斥量使用
在实际开发中,使用互斥量不当,导致程序出现“device or resource busy: device or resource busy”异常错误。使用mutex进行加锁、解锁时,必须保证lock、unlock成对出现,且每次加锁之后,正常解锁。原创 2022-08-04 15:52:45 · 525 阅读 · 0 评论 -
C++ 11多线程中互斥锁、原⼦操作和自旋锁
目录💖 简介💖 面试题(i=0,在两个线程中执行i++操作100次)💖 加锁方式💖 原子操作方式💖 自旋锁方式💖 简介通过一个面试题,对C++多线程互斥锁、原子操作和自旋锁进行学习和总结。如有理解不对的地方,欢迎各位指出,大家共同交流和学习。 如有帮助,请点赞加支持! 送人玫瑰手有余香!🌹🌹🌹💖 面试题(i=0,在两个线程中执行i++操作100次)i=0,在两个线程中执行i++操作100次,最终的结果是多少?答案:结果在2-200之间,具体不固定。下面,以一个例子进行演示,在window.原创 2022-05-27 21:49:04 · 1342 阅读 · 0 评论 -
开源库之-jemalloc开源库
目录💖 简介💖 为什么用💖 如何解决内存碎片💖 简单使用💖 简介jemalloc是一款内存分配器,与其它内存分配器(glibc)相比,其最大优势在于多线程场景下内存分配性能高以及内存碎片减少。jemalloc在Facebook公司内部很多项目中使用。redis的windows版本是用的是jemalloc库。源码下载:https://github.com/jemalloc/jemallocwindows环境下头文件及动态库,适用于vs2015或vs2017,如有需要可直接下载:链接:http.原创 2022-05-25 22:20:48 · 712 阅读 · 0 评论 -
C++ void *类型强转为int类型
目录💖 前言💖 问题描述💖 原因分析💖 解决方法💖 补充💖 前言C语言允许从void*隐式转换到其它的指针类型,但C++不允许。因为,C++对类型转换要求很高。💖 问题描述在linux平台上,进行void * 到int类型强转,出现如下错误:error: cast from ‘void*’ to ‘int’ loses precision [-fpermissive]Demo01代码如下:// Type.cpp#include<iostream>#include<st.原创 2022-05-23 18:52:18 · 6587 阅读 · 2 评论 -
malloc、calloc、realloc、new等堆内存分配函数
目录💖 前言💖 malloc、calloc和new的对比💖 realloc的作用💖 结论💖 前言malloc、calloc、realloc、new这四个函数都是从堆内存中分配内存,然后使用,但是,有所不同。如有理解不对的地方,欢迎各位指出,大家共同交流和学习。 如有帮助,请点赞加支持! 送人玫瑰手有余香!🌹🌹🌹💖 malloc、calloc和new的对比先看一段代码:void test01(){ int *p1 = (int *)malloc(sizeof(int)*5);//只分配内.原创 2022-05-03 14:56:02 · 450 阅读 · 0 评论 -
栈空间最大值问题
目录💖 前言💖 简介💖 栈大小🏆 windows平台🏆 linux平台💖 递归函数对栈大小的影响💖 修改栈大小🏆 windows平台下🏆 linux平台下💖 总结💖 前言如有理解不对的地方,欢迎各位指出,大家共同交流和学习。 如有帮助,请点赞加支持! 送人玫瑰手有余香!🌹🌹🌹💖 简介这里先给出结论,后面进行验证。Windows系统中,栈的大小被记录在可执行文件中,由编译器设置决定,VS2013中栈大小理默认为1M。linux系统中,栈大小不是由编译器决定,而是由操作系统决定,栈大小默认为8.原创 2022-05-03 14:47:02 · 2565 阅读 · 1 评论 -
大小端问题
目录💖 前言💖 何为大端小端💖 为什么会有大小端🏆 大端🏆 小端💖 大小端判断🏆 Windows平台🏆 Linux平台💖 大小端转换💖 常见大小端场景💖 Linux中的大小端转换函数🏆 小端转大端🏆 大端转小端💖 前言如有理解不对的地方,欢迎各位指出,大家共同交流和学习。 如有帮助,请点赞加支持! 送人玫瑰手有余香!🌹🌹🌹💖 何为大端小端根据数据在内存中的排列方式不同分为大端模式和小端模式,也叫大端、小端。💖 为什么会有大小端小端最符合人的思维,即:地址低位存储值的低位,地址高位存储值的高.原创 2022-05-02 23:12:14 · 1544 阅读 · 0 评论 -
C++ queue遍历输出问题
目录前言主要操作遍历元素错误方式遍历元素正确方式方式1方式2(推荐)前言queue为C++中的队列容器,具有先进先出的特点。不支持迭代器、不能进行随机访问和遍历。主要操作入栈操作:push(xx)出栈操作:pop()返回第一个元素:front()返回最后一个元素:back()原为为空:empty()主要操作示意图:遍历元素错误方式#include <iostream>#include <string>#include <queue>#inc原创 2022-04-22 17:15:11 · 5971 阅读 · 0 评论 -
C++ 11中使用stod等函数进行类型转换的问题
目录前言例子分析解决总结前言在实际工作中,经常需要对类型进行转换,如string类型的数据转为基本数据类型类型、wstring类型的数据转为基本数据类型,而C++中为我们提供了丰富的对应函数对其支持,但是,在使用的时候,一些细节需要注意。常常需要将string类型的数据转为double类型,在c++11中支持新增了stod函数进行支持,它把参数指定的字符串转换为double精度的浮点数。例子例如:将string类型的数据转为double类型stod函数是c++11中支持新增的函数,支持将stri原创 2022-04-22 11:45:52 · 8463 阅读 · 0 评论 -
linux下g++、make、cmake编译工具代码实例
目录前言代码实例项目目录结构g++方式make方式cmake方式问题总结前言g++:c++编译器make:批处理工具,通过makefile文件实现批处理,本质还是g++编译器进行编译cmake:跨平台编译工具,通过CMakeLists.txt文件实现自动编译,本质还是转成makefile实现批处理项目源码在上上一篇文章:https://editor.csdn.net/md/?articleId=124302251代码实例这个例子比较简单,主要为了说明这三个工具的使用。项目目录结构g+原创 2022-04-21 12:26:16 · 2024 阅读 · 1 评论 -
linux下cmake安装配置
前言仅作为自己记录使用。官网:https://cmake.org/download/安装前提,安装openssl、gcc、g++等工具。# 进入linux服务器上存放文件的位置cd /usr/local/src# 上传scp cmake-3.21.4.tar.gz root@192.168.159.8:/usr/local/src# 解压tar xzvf cmake-3.21.4.tar.gz# 进入目录cd cmake-3.21.4# 配置(此步,可能出现问题1错误)./bo原创 2022-04-21 12:01:47 · 1988 阅读 · 0 评论 -
C/+C++获取linux(Centos 7)系统下指定进程的CPU使用率和内存使用率等信息
目录前言代码前言linux系统一切皆文本,所以,系统相关信息可以通过读文件或执行shell命令的方式获取,这里采用后者的方式获取指定进程信息。代码.h文件#include<iostream>#include<stdio.h>#include<string>#include<string.h>#include<stdlib.h>using namespace std;class ProcessInfo{public:原创 2022-04-20 17:13:48 · 950 阅读 · 0 评论 -
C/C++ TCHAR* 作为函数返回值的问题
背景首先代码如下:#define _CRT_SECURE_NO_WARNINGS#include <iostream>#include <string>#include "stdint.h"#include <windows.h>#include <tchar.h> #include <TlHelp32.h>#include <io.h>#include <sys/stat.h>using names原创 2022-04-13 14:48:59 · 738 阅读 · 0 评论 -
C++项目工程在Linux环境开发、部署和运行问题
背景当我们自己开发的项目程序需要在linux上进行部署、调试时,项目代码完整拷贝过去之后,直接运行我们自己的可执行程序,往往提示找不到所相关的.so库,会报错。这是因为,系统只会去默认搜寻目录(/lib和/usr/lib)下,以及动态库配置文件(/etc/ld.so.conf和/etc/ld.so.conf.d/*.conf)里所列的目录下, 搜索可共享的动态库(格式如lib*.so*),进而创建出动态装入程序*(ld.so)*所需的连接和缓存文件。而我们自己项目所依赖的库路径不在上面几个路径,因此,找原创 2022-04-12 20:27:51 · 3710 阅读 · 0 评论 -
C++ 面试题:数字在升序数组中出现的次数
#include<iostream>#include<map>#include<vector>#include<algorithm>using namespace std;/*O(N)*/void test01(){ int arr[] = {1,2,3,3,3,3,4,5}; int value = 2; int num=0; int size = sizeof(arr) / sizeof(arr[0]); vector<原创 2022-02-22 21:44:35 · 445 阅读 · 0 评论 -
STL中sort函数的自定义排序问题
定义template<class _RanIt> inline void sort(_RanIt _First, _RanIt _Last)template<class _RanIt,class _Pr> inline void sort(_RanIt _First, _RanIt _Last, _Pr _Pred)提供两种调用方式,一种是使用默认的<操作符(升序)比较;一种可以自定义函数使用#include<iostream>#include&l原创 2022-02-22 21:42:36 · 181 阅读 · 0 评论 -
C++ 面向对象开发(坑3):多继承
前言因为C++支持多继承,即一个类可以有多个父类,而每个父类都有成员变量b时,在子类进行调用时,无法确定应该调用父类哪个成员变量,容易产生二义性。而java语言就不允许多继承,只允许单一继承和实现多个接口。因此,在面向对象开发过程中,应避免多继承。多继承代码实现#include<iostream>using namespace std;class A{public: int b;};class D1 :virtual public A{public: int d1;};原创 2022-02-20 17:43:54 · 541 阅读 · 0 评论 -
C++ 面向对象开发(坑2):基类的析构函数为非虚函数
前言在面向对象程序设计时,当一个类作为基类,供派生类继承使用时,其析构函数函数往往写为虚析构函数。基类采用虚析构函数会防止内存泄露。说明当基类的对象的指针指向派生类对象,若析构函数不为虚函数,delete基类对象的时候,只会调用基类的析构函数,不会调用派生类的析构函数,这样会造成内存泄露。...原创 2022-02-20 17:28:42 · 621 阅读 · 0 评论 -
C++ 面向对象开发(坑1):绝不要重新定义继承而来的非虚函数
前言在面向对象开发中,有些细节和问题需要我们注意,从而更好利用面向对象的特性开发程序,提高效率和程序的扩展性和稳定性。这条规则,不小心使用,程序不会报错,只会达不到我们预期的效果,更应该注意和避免。代码实例#include<iostream>#include<string>#include<functional>using namespace std;class CommandStrategy{public: string Command()原创 2022-02-20 17:11:57 · 372 阅读 · 0 评论 -
c++ 中的可调用对象
前言C++中可调用对象主要有:函数、函数指针、lamda表达式、bind创建的对象、function创建的函数和重载了函数调用运算符的类。可调用对象是什么可以使用调用运算符来调用的对象或表达式就是可调用对象。调用运算符就是普通函数调用时,后面跟的那个括号,如()。可调用对象的使用1️⃣函数指针#include<iostream>#include<string>#include<string>using namespace std;int add(i原创 2022-02-20 17:02:11 · 702 阅读 · 0 评论 -
C++ 面试题(面向对象篇)
面向对象文章目录面向对象前言1、什么是多态?2、什么是函数重载?有什么用?有什么好处?3、函数重载和重写的区别4、为什么不能根据返回类型不同来重载5、运行期多态的实现原理6、虚函数的调用过程7、继承下的构造函数和析构函数执行顺序8、构造函数和析构函数能否为虚函数?9、虚函数表和虚函数表指针(vptr)的创建时机?10、虚析构函数的作用11、空类默认产生哪些类成员函数12、一个空类会占多大的空间13、一个类中有一个或多个虚函数会占用多大的类空间14、什么时候必须重写拷贝构造函数15、深拷贝和浅拷贝总结原创 2022-01-23 00:47:48 · 1037 阅读 · 0 评论 -
C++ 开源网络库之libevent的使用
系列文章目录linux下 C++ 开源网络库之libevent的使用文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pan原创 2022-01-17 22:36:59 · 3631 阅读 · 0 评论 -
C++ 开源密码库之OpenSSL的使用
系列文章目录C++ 开源密码库之OpenSSL的使用文章目录系列文章目录前言一、openssl下载二、编译步骤1. 官网步骤2. 实战步骤三、 使用1.引入库2.代码实例3. 结果总结前言随着人们信息安全和软件产权的不断发展,加密技术也越来越重要,openssl作为一个功能丰富且开源的加密库,在应用开发中得到广泛的应用, 本文就openssl库下载、编译及C++项目使用进行记录和学习。一、openssl下载官网:https://www.openssl.org/官网下载来的,需要自己手动编译原创 2022-01-17 21:13:04 · 12661 阅读 · 6 评论 -
C++ 智能指针
简介C++11 智能指针文章目录简介C++11 智能指针前言一、什么是智能指针?二、智能指针的原理三、什么是智能指针循环引用?1.未循环引用情况1.1 代码如下1.2 结果如下2.循环引用情况2.1 代码如下2.2 结果如下四、智能指针循环引用会导致什么问题?五、怎么解决智能指针循环引用问题?1.方法2. 代码如下3. 结果五、成员方法调用问题1. 场景2. 代码如下3. 结果总结前言一、什么是智能指针?shared_ptr 强智能指针,可以改变资源的引用计数weak_ptr 弱智能指针原创 2022-01-17 00:45:38 · 3793 阅读 · 0 评论 -
C++优化if-else
前言针对上一篇文章,策略模式优化if-else时,随着判断情况的增多,就需要创建与之对应的类,有点麻烦,且不能直观的反应判断条件对应的业务逻辑。这里采用map+函数式编程的方式:判别条件存放在key中对应的业务逻辑放在value中。这样,每次,新增业务条件,只需要,将其业务逻辑封装为函数,增加对应的函数即可。代码实现#include<iostream>#include<string>#include<map>#include<functional原创 2022-01-16 20:00:47 · 681 阅读 · 0 评论 -
策略模式优化C++项目中的if-else语句
前言实际工作中,很多场景下需要根据不同参数执行不同的处理,首先想到的就是if-else进行判断处理。但是,如果条件太多,且条件中的处理过程比较繁多,这样处理起来就会导致代码臃肿,阅读和维护起来比较困难。因此,为了提高代码质量,往往需要对if-else进行优化。下面以项目中一个实际场景进行入手。场景需求:开发一个设备驱动软件,根据显控下发的参数,通过TCP协议发送不同的命令参数给实际设备,以达到远程控制设备的目的。#include<iostream>#include<string&原创 2022-01-14 21:26:19 · 769 阅读 · 1 评论 -
cmake编译mongo-c-driver
简介cmake-3.11.0-rc3-win64-x64.msi是一个跨平台的安装(编译)工具。mongo-c-driver-1.9.2.zip 是mongodb的C驱动,依赖libbson库。libbson-1.9.2.zip是BSON实用库工具,用于生成和解析BSON文档。以上三个软件以及编译结果可直接下载:链接:https://pan.baidu.com/s/1d1fSyeadocCnvQIG5AZjaA提取码:hzdt安装cmake下载:cmake-3.11.0-rc3-win64-原创 2021-12-25 22:38:56 · 1184 阅读 · 0 评论 -
STL-vector底层原理
1. vector容器的底层原理底层采用的数据结构是一段连续的线性内存空间。通过分析 vector 容器的源代码不难发现,它就是使用 3 个指针来表示的:class vector: public _Vector_alloc<!is_empty<_Alloc>::value,_Vec_base_types<_Ty, _Alloc> >{//动态数组public: ......}class _Vector_alloc: public _Vector_val原创 2021-10-24 00:51:35 · 424 阅读 · 0 评论 -
非静态成员函数末尾用const关键字修饰的作用
非静态成员函数后面用const关键字修饰的作用在学习boost库过程中,发现非静态成员函数后面,常常用const关键字修饰,如下<boost/timer.hpp>中timer库中的以秒为单位获取流逝时间的函数:double elapsed() const { return double(std::clock() - _start_time) / CLOCKS_PER_SEC; }为什么非静态成员函数后面用const关键字修饰那?因为,这么做可以提高原创 2021-10-23 22:01:59 · 301 阅读 · 0 评论 -
string对象的扩容规律?
string对象的扩容规律?void test01(){ string s1; cout << "字符串数量:" << s1.size() << endl; //0 cout << "字符容量:" << s1.capacity() << endl; //15 cout << "占用内存空间:" << sizeof(s1) << endl; //28}void test02()原创 2021-10-23 21:49:06 · 556 阅读 · 0 评论 -
对象模型-对象大小
静态成员变量和函数在内存所占大小?class Student00{public:private: };class Student01{public: private: int m_age; };class Student02{public: private: int m_age; string m_name;};class Student03{public:private: int m_age; string m_name; static st原创 2021-10-23 21:39:00 · 60 阅读 · 0 评论 -
windows下执行bat文件的方式
windows下执行exe或bat等程序的四种方法:#include<iostream>#include<windows.h>using namespace std;wstring string2wstring(string str){ wstring result = L""; LPCSTR temp = str.c_str(); int len = ::MultiByteToWideChar(CP_ACP, 0, temp, -1,NULL, 0); LPWST原创 2021-10-11 23:13:18 · 4905 阅读 · 0 评论 -
C++ 11格式化输出当前时间
在项目中经常需要用到当前时间,以指定的格式输出,这里利用C++11 封装一个时间格式化函数。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<chrono>#include<codecvt>#include<string>#include<iomanip>#include<algorithm>#include<sstream>using na原创 2021-09-01 22:25:41 · 4311 阅读 · 0 评论 -
C++ 定期清楚日志文件功能
在实际项目中,经常需要定期清理文件(如日志文件、历史数据文件),这里用boost和C++11,完成一个定期清理日志的功能。后续工程中,可将文件路径、清除周期和文件类型等信息做成配置文件方式,灵活运用在需要的地方。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<string>#include<chrono>#include<io.h>#include<vector>#i原创 2021-09-01 22:17:43 · 2085 阅读 · 1 评论 -
list容器中复合对象的去重问题(根据某一字段判断)
当list队列中stu元素的name字段相同时,删除age字段较小的stu元素#include<iostream>#include<list>#include<string>using namespace std;struct stu{ int age; string name;};int main(){ list<stu> li; stu s1,s2,s3; s1 = {20,"zhangsan"}; s2 = { 21, "原创 2021-06-10 23:50:55 · 140 阅读 · 0 评论 -
C++ 工作总结1
1.变量被创建之后应当及时把它们初始化。防止把未被初始化的变量当成右值使用。指针:int *p_str=NULL; 数组:char buf[10]={0}; 或memset(&buf, 0, sizeof(buf));2.使用指针之前进行判断if (p_str==NULL){ //指针为NULL时,进行程序返回,防止后面进行空指针操作 return;}else{ // 将后面正常的逻辑放在这里}3.指针使用完及时销毁 if (p_str !=原创 2020-11-13 22:16:24 · 331 阅读 · 0 评论 -
C/C++ 中为什么void可以修饰指针,但不能修饰普通变量
void *p; //可以 定义一个指针变量,但不指定具体的类型(即万能指针)Void a; //错误 不能这样使用,编译器通不过为什么会导致上面的不同那?因为,所有类型的指针变量所占内存的大小是固定的,系统分配的内存空间是一样的,即32位系统下,固定为4字节,64位系统下,固定为8字节。可以利用sizeof()获得变量占内存的大小;而普通类型的变量,不同类型分...原创 2020-03-18 23:56:45 · 681 阅读 · 0 评论 -
C/C++如何保留浮点型变量的小数点位数
在实际开发中,往往需要对获取的变量进行小数点位数控制,而常见的printf()函数,一般只在打印时对变量精度进行控制,而实际工作中,可能需要作为返回值或者变量再次使用,该函数就不能满足使用要求,因此,本文,提供如下两种方法实现。printf()函数的用例 printf("CPURate=%.2f\n", CPURate);//保留2位 printf("CPURate=%.1f\n", CPU...原创 2020-03-14 23:59:24 · 26359 阅读 · 1 评论