C++
就是那个党伟
凡心所向,素履所往。
展开
-
std::move和左值右值
首先,函数参数T&&是一个指向模板类型参数的右值引用,通过引用折叠,此参数可以与任何类型的实参匹配(可以传递左值或右值,这是std::move主要使用的两种场景)。在 C++ 中,左值是可以被取地址的表达式,而右值是临时的、不可取地址的表达式。通常,左值是具有名称、有持久性的,而右值是临时性的、瞬时的。std::move 是 C++ 标准库中的一个函数模板,用于将一个左值(左值引用)转化为右值引用,从而实现移动语义。一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址。原创 2024-05-29 11:07:19 · 443 阅读 · 0 评论 -
DLL和CRT
也就是说,每个使用CRT静态链接的dll中都有一个自己的全局堆句柄,他们自己都在这个句柄上使用内存。也就是说在编译的最后一步(链接阶段),如果程序需要使用静态库,在这一步都会一起打包到可执行文件中。所需文件:接口.h头文件,dll文件,lib文件。:每个dll都是去调用CRT库的dll函数来分配和释放内存的,使用的是同一个句柄,所以没问题。CRT运行时库是程序在运行时所需要的库文件,通常运行时库是以LIB或DLL形式提供的。若作为其他库的依赖库,将会造成多余的副本,因为必须与目标文件打包。原创 2024-05-30 10:49:24 · 331 阅读 · 0 评论 -
C++深拷贝和浅拷贝
*特点:**如果原始对象和拷贝对象共享同一块内存,当其中一个对象修改了这块内存中的数据时,另一个对象中的数据也会被修改,因为它们指向同一块内存区域。这可能导致意外的数据修改或释放问题。浅拷贝带来的问题是堆区的内存重复释放,当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,从而导致指针使用异常而程序崩溃。深拷贝是指在拷贝对象时,会创建一个新的对象,并将原始对象的所有内容都复制到新对象中,包括指针所指向的内容。原创 2024-05-30 10:15:10 · 153 阅读 · 0 评论 -
windows获取系统DPI
dc.GetDeviceCaps(LOGPIXELSX); //每英寸水平逻辑像素数dc.GetDeviceCaps(LOGPIXELSY); //每英寸垂直逻辑像素数dc.GetDeviceCaps(HORZRES); //水平像素总数dc.GetDeviceCaps(VERTRES); //垂直像素总数dc.GetDeviceCaps(DESKTOPHORZRES); //可视桌面的水平像素总数dc.GetDeviceCaps(DESKTOPVERTRES); //可视桌面的水平像素总数dc原创 2022-02-17 18:08:34 · 3531 阅读 · 0 评论 -
[VS] 线程解冻和冻结
工具:vs2019系统:win10语言:C++本文主要通过 VS 自带的诊断工具,对线程进行冻结和解冻调试。昨天遇到一个问题,客户端会发出 gss0.bdstatic.com 的请求,但是代码里并没有搜到。所以需要定位是dll哪个模块发出。程序启动后,打开线程界面:对其中的线程进行单独冻结:最后定位到,是其中一个 xxx.dll ,发送的请求。...原创 2021-09-01 14:21:10 · 575 阅读 · 0 评论 -
[VS] 诊断工具,检测内存泄漏,进行内存调优
工具:vs2019系统:win10语言:C++github 调试 demo:dangwei-90/ProcessOptimize (github.com)本文主要通过 VS 自带的诊断工具,对程序进行memory 内存调优。原创 2021-01-19 11:26:12 · 6558 阅读 · 4 评论 -
[VS] 诊断工具,CPU调优
工具:vs2019系统:win10语言:C++github 调试 demo:dangwei-90/ProcessOptimize (github.com)本文主要通过 VS 自带的诊断工具,对程序进行CPU调优。Begin1. 编译测试 demo 读者可以通过dangwei-90/ProcessOptimize (github.com)下载,也可以自己编写测试 demo. 通过一个 while 循环来占用 CPU 资源。void CProcessOptimizeDlg...原创 2021-01-19 11:15:39 · 1522 阅读 · 0 评论 -
[C/C++] undefined reference to ‘std::cout‘
gcc TrackersManger.cpp -o TrackersManger编译时出现如下错误:原因是:编译 cpp 文件时,需要使用 g++ 编译,改为如下即可:g++TrackersManger.cpp -o TrackersManger原创 2021-01-13 11:15:40 · 953 阅读 · 0 评论 -
[C++] CreateThread() 与 _beginthread() 的区别
在windows开发中,我们有两种创建线程的方式:第一种:Windows API CreateThread() 来创建线程;用ExitThread() 来退出线程;第二种:调用MSVC CRT的函数 _beginthread()或_beginthreadex()来创建线程;用 CRT的_endthread() 来退出线程。而实际上,_beginthread()的内部实现,也是通过调用CreateThread() 来实现的创建线程。这两种方式的区别在于,CreateThread()...原创 2020-12-04 11:26:39 · 652 阅读 · 0 评论 -
[C++] 线程同步的四种方式和demo
源码路径:dangwei-90/ThreadSync: 线程同步 (github.com) (https://github.com/dangwei-90/ThreadSync)编译平台:win10编译工具:vs2019语音: C++下边直接看demo,一目了然。1.线程未同步的demo// thread_sync.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include &l...原创 2020-11-23 16:41:20 · 424 阅读 · 0 评论 -
extern C 的用法
extern "C"的作用:C++代码中,用 extern "C" 修饰的代码,会按照C代码编译。解决的问题:C++支持函数重载,编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名; C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般只包括函数名。因此为了C++可以兼容调用C的代码,采用 extern "C"。eg:// 1.修饰整块代码#ifdef __cpluscplusextern...原创 2020-11-09 23:05:39 · 370 阅读 · 0 评论 -
[C++11] nullptr 和 NULL
在工作中,避免产生“野指针”最有效的方法,是以下两点:1.在定义指针的同时完成初始化操作,即便该指针的指向尚未明确,也要将其初始化为空指针。2. 在delete释放该指针后,对该指针赋值为空指针。C++11 新增关键字 nullptr ,专门用来初始化空类型指针;而 NULL 则表示 0。eg:#include <iostream>using namespace std;void test_null(void* v) { cout << "void*" .原创 2020-11-03 20:37:47 · 357 阅读 · 0 评论 -
[C++11] constexpr 关键字,以及 constexpr 与 const 的区别
C++11 新特性中,添加constexpr 关键字constexpr 特性:1. constexpr 修饰普通变量,表示常量表达式;2. constexpr 修饰函数。该函数需要满足: a.只能包含一条 return 返回语句; b.函数必须有返回值; c.函数在使用之前,必须有对应的定义语句; d. 返回的表达式必须是常量表达式。constexpr 和 const 的区别constexpr 关键字修饰的是常量;所谓常量表达式,指的就是由多...原创 2020-11-03 11:18:08 · 404 阅读 · 0 评论 -
[C++] volatile 关键字
C/C++ 中的 volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。示例:// 环境// system: win10 x64// 编译器: vs2019// release & debug , x86// 注意:x64需要安装其他工具,才能支持汇编指令,所以在x86平台测试。#include <.原创 2020-10-31 13:55:59 · 163 阅读 · 0 评论 -
[C++11] decltype 关键字
decltype (declare type) 是C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导。用法:decltype(exp) varname = value;对比auto : auto varname = value;auto 根据=右边的初始值 value 推导出变量的类型,而 decltype 根据 exp 表达式推导出变量的类型,跟=右边的 value 没有关系。注意:exp 就是一个普通的表达式,它可以是任意复杂的形式,但是我们必须..原创 2020-10-31 13:27:42 · 232 阅读 · 0 评论 -
[C++11] auto 关键字
C++11 赋予 auto 关键字新的含义,使用它来做自动类型推导1.简单赋值用法以及和const配合使用// 普通赋值用法auto n = 27; // auto 表示 intauto m = 27.7; // auto 表示 doubleauto i = &n; // auto 表示 int*auto url = "https://blog.csdn.net/dangwei_90"; // auto 表示 const char*// 配合const使用用法int原创 2020-10-30 11:48:43 · 416 阅读 · 0 评论 -
Binary Search Tree
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树:a.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;b.若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;c.它的左、右子树也分别为二叉排序树。@20180515 修剪二叉树,使二叉树的左子树结点值大于L,右子树结点值小于R [L...原创 2019-09-18 11:02:53 · 3333 阅读 · 0 评论 -
C++弹出预览文件目录并获取选中文件路径
//************************************// Method: GetSelectFilePath// Access: public// Returns: int// CreateTime: 2018年08月09日// Author: d// Describe: 弹出预览文件目录并获取选中文件...原创 2019-09-18 10:44:16 · 955 阅读 · 0 评论 -
C++弹出预览目录并获取选中路径
//************************************// Method: GetSelectPathFromBrowse// Access: public// Returns: int// CreateTime: 2018年07月18日// Author: d// Describe: 弹出预览目录并获取...原创 2019-09-18 10:35:00 · 581 阅读 · 0 评论 -
C++函数CreateProcess隐藏窗口
//************************************// Method: CreateMyBatOrProcess// Access: public// Returns: void// CreateTime: 2018年07月18日// Author: d// Describe: CreateProce...原创 2019-09-17 15:21:17 · 2340 阅读 · 0 评论 -
[C/C++] 获取当前程序路径(windows 和 linux)
// 定义变量,用户存放程序路径TCHAR m_InstallPath[2*MAX_PATH] = {0x00};//************************************// Method: GetInstallPath// FullName: CPrintClientDlg::GetInstallPath// Access: public...原创 2019-09-17 15:05:46 · 7333 阅读 · 0 评论 -
ATL::CPath用法
ATL::CPath path("C:\\HD\\test");1. 在末尾添加反斜杠 path.AddBackslash(); // C:\\HD\\test\\2. 在末尾增加扩展名 path.AddExtension(".txt"); // C:\\HD\\test.txt3. 在末尾增加新的 path.Append("append"); // C:\...原创 2019-09-18 11:05:50 · 1051 阅读 · 0 评论 -
C++关键字explicit
C++中的explicit关键字只能用于修饰只有一个参数的类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的。跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。 eg:Class CNoExplicit{ public: int nNum; CNoExplicit(int nNum) { ...原创 2019-09-18 11:07:24 · 242 阅读 · 0 评论 -
string16类型转string
std::string WChar2Ansi(LPCWSTR pwszSrc) { int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL); if (nLen <= 0) return std::string(""); char* pszDst = new char[nLe...原创 2019-09-18 11:08:54 · 2925 阅读 · 0 评论 -
Binary Tree with BFS
遍历二叉树:前序遍历、中序遍历、后序遍历、BFS、DFS 5种方式。本篇介绍 BFS 遍历方式。BFS:宽度优先搜索, 从根节点开始, 沿着树的宽度遍历树的节点; 如果所有节点均被访问, 则算法中止。 保证这个访问的顺序,借助队列数据结构,由于队列是先进先出的顺序,因此可以先将左子树入队,然后再将右子树入队。 这样一来,左子树结点就存在队头,可以先被访问到。例子:用BFS方...原创 2019-09-18 11:10:39 · 144 阅读 · 0 评论 -
STL queue
STL 常用的有vector/unorder_map/queue等,本篇为queuequeue, 队列, 队列也是一种逻辑数据结构, 其具有先进先出的特性;queue 构造函数std::deque<int> mydeck (3,100); // 3个元素,值为100std::list<int> mylist (2,200); // l...原创 2019-09-19 11:18:31 · 242 阅读 · 0 评论 -
编译时断言static_assert
C++11以后支持使用static_assert,实现编译过程中断言。用法如下:static_assert(bool, "description")bool为假时,编译中断,并输出 description 信息C++17以后,支持 static_assert(bool)....原创 2019-09-19 11:18:08 · 660 阅读 · 0 评论 -
编译报错undefined symbol: vtable for
报错:undefined symbol: vtable for原因:结构体/类中的某个方法不是纯虚函数,而且没有被定义。解决方法:找到这个没有被定义的函数,然后定义即可。...原创 2019-09-19 11:29:50 · 11257 阅读 · 0 评论 -
linux命名管道的通信
// 发送端:// 1,建立管道:mkfifo(FIFO_FILE_PATH, 0777);// 2,打开管道:int fd = open("/tmp/myfifo", O_WRONLY);// 3,写数据:write(fd , “Love Linux!”, 11);// 接收端:// 1,打开管道:int fd = open("/tmp/myfifo", O_RDONLY)...原创 2019-09-19 14:34:51 · 270 阅读 · 0 评论 -
俩道厉害的面试题
选自论坛:http://bbs.csdn.net/topics/370070922 1.不用局部变量和全局变量实现strlen; 2.有2数据,写一个交换数据的宏; 先自己思考:--------------------------------------------------------------------------- 1解答:size_t strlen原创 2013-05-15 15:54:55 · 1177 阅读 · 0 评论 -
简短的char*与char[]
#include int main(){char s[20]="Golden Global View"; //Golden Glo//char *s=Golden Global View"; //error! //变量s是放在栈中的,而它指向的字符串"GoldenGlobalView"是放在只读数据区的,不能通过指针修改char *p=s;p = p+10;原创 2013-05-01 22:47:43 · 1074 阅读 · 0 评论 -
[C/C++]洗牌算法
#include #include #include int d[6];int i,n,a,b,t;int c,j;void main() { srand(time(NULL)); printf("shuffle 0..n-1 demo\n"); for (n=1;n/* 测试1~5个元素 */ printf("_____n=原创 2013-05-03 02:08:30 · 3882 阅读 · 2 评论 -
[C++]多态的使用
#include #include #include using namespace std; class base {public: virtual void print() { cout"it is in base::print" } virtual ~base(){}}; class son:public b原创 2013-05-01 17:56:21 · 1018 阅读 · 0 评论 -
[C/C++]相对路径&绝对路径 斜杠&反斜杠的区别
文件路径:正斜杠和反斜杠正斜杠,又称左斜杠,符号是"/";反斜杠,也称右斜杠,符号是"\"。 文件路径的表示可以分为绝对路径和相对路径: 绝对路径表示相对容易,例如:pDummyFile =fopen("D:\\vctest\\glTexture\\texture\\dummy.bmp", "rb");给出了从盘符开始的全部路径,这里需要注意的是“\”要用双斜线"\\",v原创 2013-05-04 00:33:10 · 7064 阅读 · 1 评论 -
[C/C++] 缓冲区输出的条件
缓冲区输出的条件:1 缓冲区满了2 遇到 \n3 函数结束了4 使用 fflush() 强制输出原创 2013-05-07 13:04:44 · 939 阅读 · 0 评论 -
[C/C++]汉诺塔的实现
/*如果是1个盘子 直接将A柱子上的盘子从A移到C 否则先将A柱子上的n-1个盘子借助C移到B,然后直接将A柱子上的盘子从A移到C 最后将B柱子上的n-1个盘子借助A移到C*/#include void hannuota(int n, char A, char B, char C){ if (1 == n){ //对只有各异盘子时的判断 printf("原创 2013-05-03 20:49:08 · 1832 阅读 · 0 评论 -
【C/C++】实现num以内的完全数
#include "stdio.h" //如果使用CPP,则使用以下头文件和作用域//#include //using namespace std;void main(){ int range; int sum; int k,j; printf("请输入您想要的完全数的范围:\n"); scanf("%d",&range); for(k=2;k<=ra原创 2013-04-28 14:06:56 · 2649 阅读 · 2 评论 -
对于cin提取输入流遇到空格的问题
引子老谭CPP教材: “流提取符 >> 从流中提取数据时通常跳过流中的空格 tab键换行符等空白字符。”(P430页倒数第10行 13.3.1 cin流) “用cin>> 读取数据时遇到空白字符(包括空格 tab键和回车)作为终止字符。”(P436 第一行)或许有童鞋会问:这两句话 不是矛盾吗?下边举3个例子,可以看清结果:eg1:原创 2013-05-01 13:25:25 · 18561 阅读 · 4 评论 -
【C++】对象和指针
#include using namespace std;class time{public: time(int,int,int); int hour; int min; int sec; void get_time();};time::time(int h,int m,int s){ hour=h; min=m; sec=原创 2013-04-29 13:52:54 · 1056 阅读 · 0 评论 -
午饭后来个小甜点。rand
#include #include "ctime"using namespace std; class Singer{public: Singer(int num,string Name); string name; int number; int counter; int grade;}; Singer::Sing原创 2013-04-29 14:36:27 · 742 阅读 · 0 评论