- 博客(21)
- 资源 (3)
- 问答 (1)
- 收藏
- 关注
原创 真正理解std::move
std::move的作用只有一个,那就是把一个左值强制转换为右值,有了这个右值,右值允许的任何操作就可以实施了。调用类型T的移动构造函数,使得temp指向x的资源(包括temp的值等于x的值),这个时候x依然是个左值。让y指向temp的资源(包括y等于temp的值,也就是最初的x的值)第二行 代码:x = std::move(y);黄色数字1表示 执行T temp = std::move(x),这里移动构造函数被调用。黄色数字3表示 执行y = std::move(temp),这里移动赋值函数被调用。
2025-01-27 10:05:50
292
原创 理解C++中的右值引用
2. 右值引用的操作和左值引用一样,操作右值引用,就是操作源对象本身,因为右值引用就是源对象的一个别名。看下面的例子,操作左值引用、右值引用、源对象中的任何一个,其它两个都相应变化。右值引用,顾名思义,就是对一个右值进行引用,或者说给右值一个别名。右值引用的规则和左值一用一模一样,都是对一个值或者对象起个别名。牢牢记住,右值引用就是给右值(纯右值、将亡值)起个别名,延长右值的生命周期,没看到多大的使用价值。1. 右值引用和左值引用一样,在定义的同时必须立即赋值,如果不立即赋值,语法错误,看下面的例子。
2025-01-26 21:52:27
350
原创 理解参数依赖定位(ADL)规则
参数依赖搜索(ADL)规则,就是Argument-Dependet Lookup,它是一套针对没有限定范围的函数的搜索定位规则。另一个定义:如果一个或者多个函数参数类型是在和函数同样命名空间内被定义的话,你就没有必要在函数调用的时候注明函数的命名空间。
2024-01-22 22:53:40
850
原创 函数模板为什么没有偏特化?
template void f(A a, int b){} 当成一个新的函数模板,这个函数模板只有一个形参,而函数本身使用两个参数,其中一个是行参A,另一个是一个int参数,于是上述的代码就不符合函数模板的语法,因为f的形式不合法,因此编译不过去,所以我们期望的函数模板偏特化就非法了,改为4处的代码就可以编译通过了。1. 优先选择非模板函数(5处),f(a,a)使用函数5处.
2024-01-01 23:33:29
686
原创 到底什么是type traits
type_traits 称为类型萃取技术,主要用于编译期获取某一参数、某一变量、某一个类等等任何 C++相关对象的类型,以及判断他们是否是某个类型,两个变量是否是同一类型,是否是标量、是否是引用、是否是指针、是左值还是右值,还可以将某个为某个类型去掉 cv(const volitale)属性或者增加 cv 属性等等。然后再创建一个模板类,等模板类实例化的时候,里面包含实例化的类型。我们从一个具体的需求开始分析,我们想在一个模板函数中获取模板的具体类型,针对不同的具体类型,有一些特殊的处理。
2023-12-18 04:30:19
111
1
原创 左值/右值/左值引用/右值引用/万能引用/移动语义/完美转发,你真的懂了吗?
右值引用和左值引用类似,都是为一个量(对象)起了个别名,操作右值引用和左值引用等价于操作被引用量本身。
2023-12-10 01:26:23
126
1
原创 Git, 你必须要知道的那些事(1)
还有一种情况,如果我们使用forked repository的模式,看下图,在我们的本地所做的修改想提交到Origin,然后再从Origin上提交pull Request来合并自己的代码到Upstream的main分支的时候,upstrea上的main分支已经有很多提交了,这种情况如何处理呢?首先列出一个经典的Git Flow,大部分命令都是有使用条件的,只有在满足使用条件的情况下,这些命令才会得到期望的结果,不同的条件下,你需要使用不同的命令。撤销提交到暂存区的修改, 修改内容恢复到工作区。
2023-11-21 02:29:29
77
原创 STP/RSTP那点事-2
STP/RSTP原理STP端口状态 在STP中,端口有三种角色:Root端口、Designated端口和Nondesignated端口。每个端口可能会有五种工作状态,见图8 图8图9是另一种描述,其中√表示具备该项功能 状态收BPDU发BPDU学习MAC收/发数据Disabled(禁用)XXXXBlocking(阻塞)√XXXListening(...
2023-11-21 00:19:46
288
1
原创 SQL中,如何正确理解字段值NULL
工作性质转向数据库居多, 于是花了些时间强化数据库知识,在看到case when 结合sum的用法时,看到一个例子,于是引出了本片文章。下面的SQL语句,用来创users建表,并依次添加8条记录,注意有3条记录的SEX字段没有赋值,默认为NULL。SQL> create table users(id int,name varchar2(20),sex number);SQL> insert into users(id,name) values(1,'张一');SQL> inse.
2021-06-24 23:40:58
532
转载 成员函数和运算符的重载
成员函数和运算符的重载一、构造函数的重载构造函数可以重载,使得生成实例时非常方便。构造函数一般要对成员变量赋初值,有2种写法:#include #include using namespace std;class stuff { string name; int age;public: stuff() { //这是写法一
2013-04-05 20:32:40
864
原创 MFC 中位图的使用
1. 获得目标DC句柄2.创建一个与目标DC兼容的内存DC3.将位图句柄选到内存DC上,同时保存旧的位图句柄4.使用GetObject 函数获取位图的内容5.使用BITBL函数将内存DC中的位图拷贝到目标DC上(这种方法也经常被用来解决闪屏问题)6.不要忘记将位图从内存DC中选出来(必须,因为一个位图被选进一个内存DC后,如果不释放,该位图无法再次被选进)7.销毁内存DC
2013-04-01 23:18:29
989
转载 CString实现原理
MFC中CString类的实现在strcore.cpp中,Cstring封装了一个用来存放字符串的缓冲区和对施加于这个字符串的操作。也就是说 ,CString里需要有一个用来存放字符串的缓冲区,并且有一个指针指向该缓冲区,该指针就是LPTSTR m_pchData。但是有些字符串操作会增建或减少字符串的长度,因此为了减少频繁的申请内存或者释放内存,Cstring会先申请一个大的内存块用来存放字符串
2013-01-28 01:47:23
593
转载 Windows内存结构 .
1.进程虚拟地址空间布局: 每个进程都被赋予它自己的虚拟地址空间。对于3 2位进程来说,这个地址空间是4GB,Win2K在IA-32架构的CPU下面的进程地址空间分布如下表所示: 可见Win2K的内存布局非常简单,主要有4个部分,两个不能被存取的64K;然后剩下的部分就是分别是用户空间(2G–128K)和
2013-01-28 01:32:01
711
原创 如何扑捉到WM_NCLBUTTONUP(OnNcLButtonUp)消息
在点击标题栏,一直获取不到WM_NCLBUTTONUP消息。查了一下MSDN,说是当在非客户区点击鼠标时,窗口可以截获WM_NCLBUTTONDOWN,然后可以截获WM_ENTERSIZE消息,然后该窗口就被SetCapture(不再产生非客户区的消息了;同时所有的鼠标消息,即便鼠标不在这个窗口上的操作,也被传到这个窗口的窗口函数来处理。我一直没有搞清楚后面一条的应用场景),然后进入moving
2012-12-29 04:06:35
2284
原创 有关DLL的几个问题
一、DLL被多个进程调用问题Win32系统会确保内存中只有一个该DLL的拷贝,这是通过内存映射文件来实现的。不同的进程分别将这份DLL的代码段地址映射到自己的进程空间中,同时不同的进程在自己的进程空间分别有各自的一份该DLL的数据段拷贝。这是因为,在Win32环境中,每个进程都有了它自己的地址空间,DLL函数中的代码所创建的任何对象(包括变量)都归调用它的进程所有。当进程在载入DLL时,操
2012-11-30 23:42:10
2070
原创 MSCOMCTL.OCX 中的LISTVIEW控件各类异常终极解决方案
在一个VB工程或者VBA工程中(以下简称VB应用)用到MSCOMCTL.OCX 中的LISTVIEW控件,经常遇到一些莫名其妙的问题,比如:在机器A上运行正常,一段时间后,在A上无法运行了,即便你再重新注册你的MSCOMCTL.OCX文件,任然无法正常工作在机器A上运行正常,到机器B无法运行 在机器A上运行正常,在机器B上编辑过VB应用后,在A上无法运行了 正好这几天就碰
2012-11-28 04:25:40
7990
原创 什么是模板
一、什么是模板?模板是实现代码重用机制的一种工具,实质就是实现类型参数化,即把类型定义为参数。两类模板,一是函数模板,二是类模板。所谓函数模板,就是建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟
2012-06-14 23:27:26
2476
原创 Can't find dll entry point GetModuleHandleA in kernel32
最近在用COOPER的变电站自动化产品的HMI做二次开发,很简单,VBA开发。由于技术手册简单,技术服务 also too bad,被逼无奈,我准备在VBA中使用HOOK来截获HMI的消息,以便做更多的应用。但在开发这个钩子的时候,遇到了上述问题,GOOGLE了一上午,没发现任何有价值的答案。我做了10多年的c++,对DLL还是非常熟的。无非两种原因导致这种情况,一是DLL本身没有导出这个函数
2012-04-13 23:44:41
1519
原创 开博第一篇
以前在国内的时候,天天瞎忙! 现在到了北美工作,感觉有时间了,应该写点东西了,技术的,生活的,神马都行,好了,这是开博第一篇,让自己把话说出来,
2011-08-07 00:23:39
525
同样的代码,同样的数据量,为啥这个循环执行越来越慢?
2022-07-27
TA创建的收藏夹 TA关注的收藏夹
TA关注的人