- 博客(32)
- 资源 (1)
- 收藏
- 关注
原创 c++ trait和policy(c++ template这本书)
trait template <typename T> T accum(T const* beg,T const* end) { T total = T();//假设T事实回生成一个等于0的值 while(beg!=end) { total += *beg;// 问题是假如 T类型 是char ,和就会溢出 beg++; } return total; } 把上面的和的类型改为 AccumTraits<T>::Acct ,简单方法再传一个模板参..
2021-10-07 19:23:03
169
原创 VS2013 tuple 源码分析
tuple这玩意实现方法就是递归方式展开函数包的完美示例。相关文章可以查看<深入应用C++11>3.2.1.1章节。tuple的实现思想可以查看侯捷老师视频:https://www.bilibili.com/video/BV1p4411v7Dh?p=20假如我们现在有如下源码:tuple<int, double, char*> my_tuple = make_...
2020-04-18 17:01:57
350
原创 VS2013 enable_if 源码分析
//xtr1common文件 // TEMPLATE CLASS enable_iftemplate<bool _Test, class _Ty = void>//第一个模板参数类型bool,这是一种技术 struct enable_if { // type is undefined for assumed !_Test };template<class _Ty&...
2020-04-12 20:38:03
277
原创 Win32 窗口创建流程及消息机制 代码简示
// Win32Test.cpp : 定义控制台应用程序的入口点。//#include <Windows.h>#include "resource1.h"#include <commctrl.h>#include <stdio.h>#pragma comment(lib,"comctl32.lib")LRESULT WINAPI WndPr...
2019-09-26 15:44:18
384
原创 VS 2010 algorithm 常见函数及技巧
1、find(_Unchecked与_Rechecked)这个函数的作用就是在一个容器的一段迭代器范围之内查找第一个与_Val相等的迭代器。这个函数有两个模板参数,一是容器迭代器类型_InIt,二是进行比较的值得类型_Ty。下面这一段代码返回的就是一个指向vecInt中第二个元素的迭代器。 vector<int> vecInt; vecInt.push_back(1); ...
2019-09-19 11:09:06
755
原创 MFC线程独立对象管理机制分析
可以参考这篇博文https://blog.csdn.net/likePeak/article/details/3595982#define EXTERN_THREAD_LOCAL(class_name, ident_name) \ extern CThreadLocal<class_name> ident_name;THREAD_LOCAL(_AFX_THREAD_STATE...
2019-09-04 13:57:20
306
原创 MFC 消息机制函数映射表
#define DECLARE_MESSAGE_MAP() \protected: \ static const AFX_MSGMAP* PASCAL GetThisMessageMap(); \ virtual const AFX_MSGMAP* GetMessageMap() const; \#define BEGIN_MESSAGE_MAP(theClass, baseC...
2019-08-29 13:54:39
221
原创 C++类型转换 const_cast static_cast dynamic_cast reinterpret_cast
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a。C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。const_cast,字面上理解就是去const属性。static_cast,命名上理解是静态类型转换。如int转换成char。dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。rein...
2019-08-20 17:50:23
435
原创 VS 2010 shared_ptr 源码分析
类结构框架下面这张图来自于网络,已不知原作者。这张图表明了shared_ptr类结构图_Ref_count_base是在shared_ptr创建的时候new出来的。_Ref_count_base有3个子类,分别对应shared_ptr构造时的3种形式。在shared_ptr的实现中,会根据调用的shared_ptr构造函数的不同,使用不同类型的_Ref_count_base创建。_Re...
2019-08-20 17:32:05
430
原创 VS 2010 STL stack与queue源码分析
stack是栈,先进后出,只能一头操作;queue是队列,先进先出,一头进,另一头出。VS里的stack与queue底层都是使用双端队列deque实现的。通过改变deque的行为而生成不同的容器,这就做容器适配器。stack // TEMPLATE CLASS stacktemplate<class _Ty, class _Container = deque<_Ty&g...
2019-08-18 21:35:44
184
原创 VS 2010 STL deque源码分析
定义deque 即双端队列,与vector相比,此容器多出了pop_front()和push_front()这两个操作,即在首部的增删操作;而与list相比,deque多出了对容器元素的随机访问功能。写在文章之前网上也有很多关于deque源码分析的文章,不过大部分都是继承自侯捷《STL源码分析》中关于deque源码的讲解。鲜有VS版本 STL deque源码的讲解,现在就来看看VS版本...
2019-08-18 17:49:10
347
原创 C语言难点总结
1,*与++结合char str[20]="123456789";char* p =str;char c1 = *p++; //c1为字符 1*p++解析:*与++运算符 优先级同级,此优先级 结合方向 从右到左 。所以先++,后*;后自增,先用一个副本取出p的值,再自增,然后*作用到副本上,取出值为1。*++p 编译是没有错误的+(加)与<<...
2019-08-16 15:47:52
589
原创 VS 2010 CRT ::operator new源码分析
从我们写代码说起C++面试常见的一个问题是:new与malloc的区别,然后你去网上搜索这个问题,常见回答如下:malloc : 只能单独给对象申请空间,不能进行构造函数的调用new : 不仅能申请动态空间,还能调用构造函数进行对成员变量初始化我们此篇文章对哪一块源码分析呢?对,就是对new的分配内存的那部分源码进行分析。::operator new这是一个重载,重载的功能就只是...
2019-08-12 10:57:11
780
原创 VS 2010 auto_ptr
定义下面这段描述来自http://www.cplusplus.com/reference/memory/auto_ptr/Note:This class template is deprecated as of C++11.unique_ptris a new facility with a similar functionality, but with improved secu...
2019-08-11 23:29:51
270
原创 VS 2010 STL list源码分析
类结构框架(debug模式) // TEMPLATE CLASS _List_nodtemplate<class _Ty, class _Alloc> class _List_nod : public _Container_base//即为_Container_base12 { // base class for _List_val to hold storage...
2019-08-11 22:16:09
340
原创 VS 2010 STL vector源码分析
类结构框架vector继承于_Vector_val,继承于_Container_base,_Container_base在debug模式下(只探索debug模式)就是如此定义:typedef _Container_base12 _Container_base;这里面最重要的就是定义了一个叫做“容器代理”的成员变量_Container_proxy *_Myproxy;这个“代理”,就是在cont...
2019-08-11 17:18:53
1400
原创 VS 2010 STL 内存分配器
Alloc是分配内存之意,Construct是在内存里构造之意。就好C++里的new有分配内存,在分配的内存里构造我们的对象这两层作用。其实这也就是分配器的作用。替换new与delete。// TEMPLATE FUNCTION _Allocatetemplate<class _Ty> inline _Ty _FARQ *_Allocate(_SIZT _Count, _T...
2019-08-10 00:06:28
460
原创 Qt 信号与槽机制
下部分代码来自于https://blog.csdn.net/l09711/article/details/7451140,我自己添加了传递参数的部分#ifndef MY_OBJECT#define MY_OBJECT#include <map>#define my_slots#define my_signals protected#define my_emit...
2019-08-08 13:18:50
235
原创 MFC 运行时类型识别(RTTI) 动态创建
class CDynamicClassTestDlg : public CDialogEx{ DECLARE_DYNAMIC(CDynamicClassTestDlg)}#define DECLARE_DYNAMIC(class_name) \protected: \ static CRuntimeClass* PASCAL _GetBaseClass(); \publi...
2019-08-05 14:59:27
283
1
原创 Windows线程同步
CriticalSectiontypedef RTL_CRITICAL_SECTION CRITICAL_SECTION;typedef struct _RTL_CRITICAL_SECTION { PRTL_CRITICAL_SECTION_DEBUG DebugInfo; // // The following three fields control ent...
2019-08-05 09:57:44
283
原创 Windows动态TLS
windows实现方法大概是这样的(只是为了说明,便没有加锁)。预留进程刚创建的时候在内存中创建TLS_MINIMUM_AVAILABLE个TlsData,供所有线程使用,当一个线程调用TlsAlloc占用了一个index,其他线程也可以使用这个index。每个线程只能往某线程TlsAlloc分配(无论哪个线程分配的)的号对应索引里TlsSetValue和TlsGetValue。...
2019-08-04 11:08:41
179
原创 VS2010 std::string 源码分析
分配内存原理分配内存原理union _Bxty{ // storage for small buffer or pointer to larger one _Elem _Buf[_BUF_SIZE]; _Elem *_Ptr; char _Alias[_BUF_SIZE]; // to permit aliasing} _Bx;这个_Bxty是一个union。当分配字符串所需内...
2019-08-04 10:59:43
1258
1
原创 VS2010 字符串函数源码汇总
// strcpy(p, p1) 复制字符串 源码在 strcat.c 中// strncpy(p, p1, n) 复制指定长度字符串 strncpy.c// strcat(p, p1) 附加字符串 strcat.c// strncat(p, p1, n) 附加指定长度字符串 strncat.c// strlen(p) 取字符串长度 strlen.c// st...
2019-08-04 00:28:52
1016
原创 VS2010 CString源码分析
从内存构造开始说起我们定义一个CString变量,虽然我们工程用的是Unicode设置。但是”abc”是ANSI字符串。因为我们没有加_T限制啊。CString str("abc");由此宏typedef ATL::CStringT< TCHAR, StrTraitMFC< TCHAR > > CString;CSTRING_EXPLICIT CS...
2019-08-04 00:16:05
1078
原创 Jsoncpp源码分析
object ValueJson::Value person; person["name"] = "tocy";Value类里有Value( constchar*value);构造函数Value&operator=( constValue&other);所以"tocy"自动转换为一个Value;接下来讲讲Value( constchar*v...
2019-08-03 23:10:33
1502
1
原创 VS2010 CRT 全局锁
/* * Lock Table * This table contains a pointer to the critical section management structure * for each lock. * * Locks marked lkPrealloc have their critical sections statically allocated * ...
2019-08-03 22:18:30
404
原创 生动举例讲解页表,多级页表,反向页表以及为什么多级页表可以节省空间
我这里先不讲具体的页表是怎么实现的,什么页表的大小,什么虚拟内存的大小,我讲一个例子,来生动说明页表以及证明为什么多级页表可以节省空间。例子如下:假如河北省要给全省人民办医保,需要给每一个人发一张医保卡,假若河北省有3000万人,那么就需要三千万张医保卡。但是,现在医保是在试行阶段,只有分配 医保卡号 的人才是真正有资格使用医保报销的。好了,假若现在只有 10000人有资格分配医保卡号。那么岂...
2019-06-20 10:39:04
6202
11
原创 Json数据格式解析,难点,易错点分析
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 以文本形式存在,既然谈到格式,说明这玩意就是一个约定。比如服务器(Java实现)与前端(可能是网页可能是PC端)进行数据交互,很多都用Json。JSON建构于两种结构:“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它(值)被理解为对象(o...
2019-03-19 15:07:25
1276
原创 C++ 类 难点总结
1、虚拟基类在一个虚函数的声明语句的分号前加上 =0;就可以将一个虚函数变成纯虚函数,其中,=0只能出现在类内部的虚函数声明语句处。纯虚函数只用声明,而不用定义,其存在就是为了提供接口,含有纯虚函数的类是抽象基类。我们不能直接创建一个抽象基类的对象,但可以创建其指针或者引用。值得注意的是,你也可以为纯虚函数提供定义,不过函数体必须定义在类的外部。但此时哪怕在外部定义了,也是纯虚函数,不能...
2019-02-27 11:44:59
1047
原创 轻松讲解完成端口模型
现在,快递业务是越来越多,越来越常见了。发快递,有发送端和接收端,接收快递这端大概是这么一个流程:有一个仓库,接收来自各个公司邮寄的快递,然后这个快递的派送员,一直等着仓库里有快递,只有有一件快递,则就会有一个仓库快递员去把这件快递送到客户手里。上面的流程,大概就是完成端口模型的流程了。让我细细道来。有一个老板,相当于程序里的主线程;老板盖了一间厂房,相当于程序里创建完成端口Cr...
2019-01-18 17:46:17
229
原创 最简单Windows Event 举例
#include <iostream>using namespace std;#include <Windows.h>HANDLE g_hEventFull;HANDLE g_hEventEmpty;unsigned long __stdcall ProducerThdEvent(LPVOID pram);unsigned long __stdcall C...
2018-05-22 16:37:05
948
原创 利用 c++模板 类型 推导思想,实现最简单的 判断两个类型 是否一样的 方法
第二个 结构体 is__same 是 第一个 的 特化 版本,即当<> 中两个 类型 一致 的 情况,会 根据 类型 推导 原则 ,推导 为 使用 第二个 特化 版本。代码 比较 简单,应该 很容易 看明白。template<typename T1,typename T2>struct is__same{ operator bool() ...
2017-12-19 09:56:27
2692
windows redis-3.0工程源码(无编译错误)
2019-01-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人