摘要: 前几天看到这样一篇博客《那些年·我们读过的专业书籍》,里面列了很多大家认为很好的书,加上自己在自学C++的工程中也看了不少书,感觉并不是所有的书都值得花时间去看的,毕竟很多人一年下来也看不了2,3本书,不同的技术能力的人,适合看的书都不太一样,在这么多大家都认为是经典的书中,选出几本真正适合自己的才...阅读全文
posted @ 2013-12-26 11:32 啊汉 阅读(17236) 评论(59) 编辑
摘要: 之前有一个问题一直困扰着我,就是一个变量出了作用域,我以为这个变量的内存就被回收了,其实不是这样的,昨天问了一个高手,才豁然开朗,自己在看相关代码的反汇编代码,才知道原来真是这样就。这个问题,我想简单的说一下内存的分配VS回收&构造函数VS析构函数之间的关系。我的疑问:为什么p出了作用域,指向p的ptr还能读到p中arr的内容,难道p出了作用域,还没有析构?下面的内容会解答这个疑问,先说说跟这篇文章有关的内容。可能是因为平时习惯的原因,我们在实例化一个对象的时候,往往是一条语句实现两个功能:1分配内存;2调用构造函数class A{public: A() { i=0;...阅读全文
posted @ 2013-11-09 09:43 啊汉 阅读(1835) 评论(10) 编辑
摘要: 在软件开发中,有些对象使用非常频繁,那么我们可以预先在堆中实例化一些对象,我们把维护这些对象的结构叫“内存池”。在需要用的时候,直接从内存池中拿,而不用从新实例化,在要销毁的时候,不是直接free/delete,而是返还给内存池。把那些常用的对象存在内存池中,就不用频繁的分配/回收内存,可以相对减少内存碎片,更重要的是实例化这样的对象更快,回收也更快。当内存池中的对象不够用的时候就扩容。我的内存池实现如下:#pragma once#include templatestruct ProxyT{ ProxyT():next(NULL){} T data; ProxyT* ne...阅读全文
posted @ 2013-10-28 08:33 啊汉 阅读(6575) 评论(5) 编辑
摘要: 我相信很多人对构造函数在什么时候产生,以及产生的原因,理解得不是很透彻;更有甚者认为默认构造函数和复制构造函数是一定会产生的,成员变量就应该在初始化参数列表中进行初始化,当然这些是初学者的认识,下面分享一下我的看法。构造函数不负责分配内存,只是在分配好的一块内存中进行赋值操作.这一点我们可以很容易从new/delete与malloc/free的区别中看出来,malloc/free只负责分配内存不负责初始化,而new/delete不仅负责分配内存,如果对象存在相应的够着函数,就会调用相应的构造函数,如果不存在当然就不调用,如int *i=new int[10];int类型没有构造函数,所以new阅读全文
posted @ 2013-08-25 16:41 啊汉 阅读(1789) 评论(3) 编辑
摘要: 我们知道通过一个指向之类的父类指针可以调用子类的虚方法,因为子类的方法会覆盖父类同样的方法,通过这个指针可以找到对象实例的地址,通过实例的地址可以找到指向对应方法表的指针,而通过这个方法的名字就可以确定这个方法在方法表中的位置,直接调用就行,在多继承的时候,一个类可能有多个方法表,也就有多个指向这些方法表的指针,一个类有多个父类,怎么通过其中一个父类的指针调用之类的虚方法?其实前面几句话并没有真正说清楚,在单继承中,父类是怎么调用子类的虚方法的,还有多继承又是怎么实现这点的,想知道这些,请认真往下看。我们先看单继承是怎么实现的。先上两个简单的类:#include using namespac.阅读全文
posted @ 2013-07-25 11:53 啊汉 阅读(2490) 评论(3) 编辑
摘要: 如果一个类只定义了类名,没定义任何方法和字段,如class A{};那么class A的每个实例占用1个字节的内存,编译器会会在这个其实例中安插一个char,以保证每个A实例在内存中有唯一的地址,如A a,b;&a!=&b。如果一个直接或是间接的继承(不是虚继承)了多个类,如果这个类及其父类像A一样没有方法没有字段,那么这个类的每个实例的大小都是1字节,如果有虚继承,那就不是1字节了,每虚继承一个类,这个类的实例就会多一个指向被虚继承父类的指针。还有一点值得说明的就是像A这样的类,编译器不一定会产生传说中的那6个方法,这些方法只会在需要的时候产生,如class A没有被任何地方阅读全文
posted @ 2013-07-08 09:13 啊汉 阅读(2063) 评论(2) 编辑
摘要: 简单介绍一下DataTable。DataTable主要基于表、行、单元格。行用集合包装单元格,表用集合包装行,大致就是这样。DataColumn表示单元格,DataColumn中的字段还挺多的,在实际应用中我们可能只想用它来存一个int型的数据;DataColumnCollection中用一个ArrayList封装DataColumn,表示一些单元格的集合;DataRow直接在DataColumnCollection的基础上提供一些方法,成为行记录。而DataRowCollection则用集合的方式封装DataRow成为表,但它不是以线性、链表等方式,而是基于红黑树RBTree<Data阅读全文
posted @ 2013-05-31 11:26 啊汉 阅读(3669) 评论(11) 编辑
摘要: 1:注意不要反回指向栈内存的指针或引用,因为在函数返回时改内存已经被销毁了2:C/C++没有办法知道指针所指的内存容量大小 当数组作为参数传递时,数组将退化成相同类型的指针 不要指望要指针参数去申请动态内存,因为函数会为产生一个临时变量指向参数的内存,当函数内分配内存时,将内存的地址赋给了临时参数,而没有给实参赋值,所有实参没有发生任何变化,应该修改的是指针所指的内容,而不是修改指针的指向,所有可以用指向指针的指针3:重载和内联机制既可用于全局函数也可用于类的成员函数,const和virtual机制即用于类的成员函数4:在继承关系中,非虚方法:调用指针类型的方法;虚方法:调用指针所指的对象类型阅读全文
posted @ 2013-05-20 16:41 啊汉 阅读(2094) 评论(2) 编辑
摘要: 这是一个基于windows的,用C++编写的客户端服务器程序,适合初学者,高手误入.源码必共享思路是这样的.启动服务器,服务器启动后会创建一个子线程,用于向客户端发送信息.用一个死循环用于接收客户端的请求,客户端请求成功后,会将客户端的连接保存到一个集合中,下面会详细介绍这个保存客户端连接的类.客户端连接成功后,服务器会创建一个子线程用于接收客户端的信息,客户端同样也会创建一个子线程接收服务器的信息.这样客户端和服务器就能进行通讯,如果有哪一方退出,另一方对应的接收数据的线程就会自动终止.退出一个客户端后,服务器对应的接收数据的线程自动终止.如下图:服务器保存客户端连接的集合中会删除对应的客户阅读全文
posted @ 2013-05-19 17:45 啊汉 阅读(29363) 评论(9) 编辑
摘要: 一直以为自己对多态和继承已经比较了解,当遇到虚继承的时候,发现有点犯晕,想不通了,于是在微博上向几个大神请教,很快得到了他们的回复,高兴之情无以言表。之后自己查了一些资料,结合大神的回复,在这里做一下简单的记录。我的问题如下:为什么虚继承类的sizeof要大些啊,是因为虚继承中,子类有指向父类的指针和指向父类的虚函数表的指针吗,比非虚继承多了这两个指针? @左耳朵耗子 @简悦云风 @GeniusVczh@GeniusVczh:调用的时候给的this和函数实际需要的this的指针不一定是一样的,多重继承的时候已经这样了。再加上你还有virtual继承,所以需要很多描述。V福尔摩斯回复 @Geni阅读全文
posted @ 2013-05-15 10:20 啊汉 阅读(3010) 评论(5) 编辑
摘要: 前几天看了开源的XML文件解析器TinyXml,它是怎么实现解析的没怎么看懂,于是决定自己实现一个,反正最近不忙。先命名为TXml。现在完成了解析和查询功能,全部代码加起来不到1000行,将会继续完善它。源码必共享先简单说一下我的思路:1:读取XML文件信息,并存入一个字符数组中;2:遍历数组,将数组解析成一棵树;3:以路径的方式查询和按属性查询;这个解析器最麻烦的地方就在怎么将字符数组解析成一颗树。我们先看一下一个简单XML文件,他包括文件头、节点、节点名称及节点值、属性名称及属性值,子节点、父节点、注释等。<?xml version="1.0" encoding=阅读全文
posted @ 2013-04-11 15:58 啊汉 阅读(4723) 评论(3) 编辑
摘要: 1:用Interlocked系列函数实现线程同步;2:用CRITICAL_SECTION及其系列函数实现线程同步;3:用RTL_SRWLOCK及其系列函数实现线程同步;4:用事件内核对象实现线程同步;5:用信号量内核对象实现线程同步;1:用Interlocked系列函数实现线程同步实例如下://旋转锁#include using namespace std; #include #include const int threadNum=10;HANDLE hThread[threadNum];volatile unsigned int ISOK=0;unsigned int _stdcal...阅读全文
posted @ 2013-03-31 14:46 啊汉 阅读(20300) 评论(1) 编辑
摘要: 1:试着用最少的比较次数去寻找数组中的最大值和最小值。思路一:扫描数组两次,第一次等到最大值,第二次等到最小值。总共比较次数2N,这是大家都可以想到的。思路二:定义两个变量存放最大值和最小值,将数组两两分组,两两进行比较,大的和最大值进行比较,小的和最小值比较,数组两两比较次数是N/2,分别与最大值和最小值比较的次数为N,总共比较次数1.5N。好久没写算法了,于是蛋疼得想实现一下。//1:试着用最少的比较次数去寻找数组中的最大值和最小值。 void FindMaxMin(int *A,int size,int* Max,int* Min){ int i=(size & 1)?1:0; 阅读全文
posted @ 2013-03-28 10:35 啊汉 阅读(3188) 评论(11) 编辑
摘要: 最近看了一下吴军的数学之美。书很好,废话我就不多少了。看了第9章图论和网络爬虫,一直都觉得网络爬虫很牛B,搜索引擎不就是用爬虫爬网页的吗,于是想写一个简单的爬虫来爬网页试试,最先想到的就是给自己的博客建一个目录,够小够简单了吧,于是就有了这篇文章,简单的分享一下,先申明我的实现很简单没有技术含量,在看下文之前可以先看看 我的博客目录。 源码必共享简单介绍一下网络爬虫的原理:给你一个网页地址,先把这个网页下载下来,然后分析这个网页的内容,得到这个网页中的所有链接,然后下载这些网页,继续分析下载。这样就能下载互联网上的很多网页。原理就这么简单,实现起来就不那么容易了。由于深入不了只能说简单的。构造阅读全文
posted @ 2013-02-20 15:38 啊汉 阅读(2719) 评论(12) 编辑
摘要: C/C++(42)COM是一个更好的C++15道简单算法题非递归实现文件夹遍历《STL系列》之map原理及实现《STL系列》之vector原理及实现C#转C++的一点分享内存的分配VS回收&构造函数VS析构函数内存池的原理及实现构造函数产生的点及原因虚方法的调用是怎么实现的(单继承VS多继承)C++...阅读全文
posted @ 2013-02-20 11:29 啊汉 阅读(2895) 评论(3) 编辑
摘要: 需求简单分析。玩过连连看的都知道,连连看其实就是测试能不能用少于等于3条相连的线,连接两个点(图片)。线的条数为0~3条。先只实现了逻辑,并做了智能测试,程序自己可以演示玩连连看的过程,界面还没有做,准备用QT(不熟),源码下载0条线表示两个点相邻,在坐标轴上看就是X轴相同,Y轴值相差1,或是Y轴相同X轴值相差1。1条线表示两个点同X或是同Y轴,且两点之间没有其他点。2条线表示两个点确定的长方形,存在连接两个点的两边上都没有其他任何点3条线复杂点,经过反复的思考,决定将3条线的情况分成5类:上下左右中(东南西北中)。这样的分类主要是想让代码更好理解,思路看起来更简单点。上:连接两个点的3条线的阅读全文
posted @ 2013-02-04 14:21 啊汉 阅读(5523) 评论(6) 编辑
摘要: 1:多余的存储引用导致性能降低;2:利用局部性提高程序性能;先来说说引用是怎么降低程序性能,个人认为降低程序性能主要有两个原因,一是数据结构选择不合理,二是多层嵌套循环导致部分代码被多余重复执行。在第二种情况下我们一般都是优化循环最里层的代码,能提出来的尽量往外层提,实在不行的就优化它的运行速度。1:多余的存储引用导致性能降低。先来看一个关于引用导致性能降低的问题。下面两个方法哪个更快。 static void Test2(ref int sum) { for (int i = 1; i <= timer; i++) { ...阅读全文
posted @ 2013-01-13 17:14 啊汉 阅读(2526) 评论(15) 编辑
摘要: 系统中的所有线程都要访问系统资源,一个线程霸占某个资源,其他需要该资源的线程就不能完成自己的任务;另外如一个线程在读取某块内存中的数据,而另一个线程又正在修改这块内存的值,这同样不是我们想要的,所以线程之间必须要有一套自己的规则,不然就凌乱了。线程之间需要通信,如A线程霸占某个B线程需要的资源X,在A占用期间,B线程只能等待,或处于挂起状态,当A线程用完资源X后,系统会告诉线程B,资源X可以用了,或是将处于挂起状态的线程B唤醒,然后线程B就获得对资源X的控制权,其他想用资源X的线程就得经历B刚才的遭遇。当多个线程同时需要某个资源时必须遵守下面两个规则:1:多个线程“同时”访问资源,不能破坏资源阅读全文
posted @ 2012-12-30 22:12 啊汉 阅读(5485) 评论(0) 编辑
摘要: 线程由两部分组成:线程内核对象和线程栈。关于内核对象请看windows内核对象简介。线程内核对象,操作系统用线程内核对象来管理线程,操作系统还用它来存放统计信息。线程栈,用于维护线程执行时所需的所有函数参数和局部变量,就是C#程序员常说的线程栈和托管堆中的线程栈。我们知道进程是有惰性的,它的所有工作都是由线程完成的,而进程只是为线程提供场地,线程函数执行我们让它执行的任务,最终线程函数将终止运行并返回,线程将终止运行,线程的内存将被释放,线程内核对象的使用计数将减一,如果线程内核对象的使用计数减为0,线程内核对象将被销毁。说了这么多,感觉有点虚,我们还是来看看创建线程的函数吧。CreateTh阅读全文
posted @ 2012-12-16 22:49 啊汉 阅读(3870) 评论(0) 编辑
摘要: 内核对象只是操作系统内核分配的一个内存块,并且只能由操作系统内核访问。该内存块是一种数据结构,它的成员负责维护该对象的各种信息。Windows提供一组函数创建和操作内核对象。调用一个创建内核对象的函数,函数会返回一个句柄,该句柄标识了这个内核对象,这个句柄可由当前进程中的所有线程调用。也可以通过跨进程边界共享内核对象,让其他的进程调用。使用计数。内核对象有个使用计数数据成员,标识内核对象被多少个进程所使用。大部分情况是内核对象只被创建它的进程所有使用,当这个进程退出时,内核对象的使用计数就会减一,如果内核对象的使用计数为0时,内核对象就会自动销毁,如果内核对象被多个进程使用时,它的生命周期就可阅读全文
posted @ 2012-12-08 18:05 啊汉 阅读(5878) 评论(0) 编辑
摘要: 上周准备在公司内部转岗,面了3个部门windows客户端相关的工作,最终拿到3个Offer,主要涉及C++和Windows两大块内容,C++的题目基本都答上了,Windows一直都是我的弱项,在这里记录一下Windows相关的题目。有些答不上的问题就没列出来,还有些问题忘了,下面的答案有些大部分是我阅读全文
posted @ 2014-11-12 11:17 啊汉 阅读(4175) 评论(13) 编辑
摘要: 在一个数组中查找某一个元素,或是在一个字符串中查找某个字符,我们一般都会写出如下代码。这样的代码虽然简洁明了,但在数组元素很多的情况下,并不是一个很好的解决方案,今天我就来分享一个提高查找速度的小技巧. 虽然每次都是写出这样的代码,但我总觉得for循环中的<判断有点多余,比如数组中有100个元素,我阅读全文
posted @ 2014-10-29 10:36 啊汉 阅读(3630) 评论(22) 编辑
摘要: 昨天看了《COM本质论》的第一章”COM是一个更好的C++”,觉得很有必要做一些笔记,于是整理成这篇文章,我相信你值得拥有。 这篇文章主要讲的内容是:一个实现了快速查找功能的类FastString,在一个小小的需求之后,慢慢的演变成一个COM组件的过程。 类FastString实现了一个快速查找字符阅读全文
posted @ 2014-06-12 14:42 啊汉 阅读(4665) 评论(8) 编辑
摘要: 最近在公司里基本处于打酱油的状态,工作正在交接中。没事又做起了算法题目。好久没怎么写算法题了,感觉手气还不错,经常能一次就写对(编译通过,得到想要的结果,没怎么测试),可能是因为这些题目之前看过或是写过,或许就是自己进步了一点。这15道大部分来自《剑指Offer》,作者的博客之前看过几次,感觉写得很阅读全文
posted @ 2014-06-06 11:56 啊汉 阅读(9111) 评论(7) 编辑
摘要: 之前有个电话面试,其中一道题就是:用非递归的方式实现文件夹遍历?在电面的时候没有答出来,过后分分钟就想到了答案,因为之前自己实现过按层序的方式打印一棵树,用的也是非递归的方式,现在遍历文件夹不就是遍历这颗树吗!怎么就没想出来呢!在这里简单的记录下,用了C#和C++两个版本实现。 我这里的实现的功能是阅读全文
posted @ 2014-05-30 12:14 啊汉 阅读(4793) 评论(19) 编辑
摘要: 上一篇文章《STL系列》之vector原理及实现,介绍了vector的原理及实现,这篇文章介绍map的原理及实现。STL实现源码下载。STL中map的实现是基于RBTree的,我在实现的时候没有采用RBTree,觉得这东西有点复杂,我的map采用的是排序数组(CSortVector)。map中的Ke阅读全文
posted @ 2014-05-26 14:06 啊汉 阅读(14039) 评论(4) 编辑
摘要: 最近忙得蛋疼,但还是想写点属于自己的东西。也不知道写点啥,最后决定试着自己实现STL中常用的几个集合,一来加深自己对STL的理解,二来看看自己是否有这个能力实现。实现目标就是:1能和STL兼容;2最大化的实现STL中的接口并保持一致。即将STL中的集合换成我写的也能用。这篇博客介绍的是vector的阅读全文
posted @ 2014-05-19 21:06 啊汉 阅读(21414) 评论(3) 编辑
摘要: 前几天看到这样一篇博客《那些年·我们读过的专业书籍》,里面列了很多大家认为很好的书,加上自己在自学C++的工程中也看了不少书,感觉并不是所有的书都值得花时间去看的,毕竟很多人一年下来也看不了2,3本书,不同的技术能力的人,适合看的书都不太一样,在这么多大家都认为是经典的书中,选出几本真正适合自己的才...阅读全文
posted @ 2013-12-26 11:32 啊汉 阅读(17236) 评论(59) 编辑
摘要: 之前有一个问题一直困扰着我,就是一个变量出了作用域,我以为这个变量的内存就被回收了,其实不是这样的,昨天问了一个高手,才豁然开朗,自己在看相关代码的反汇编代码,才知道原来真是这样就。这个问题,我想简单的说一下内存的分配VS回收&构造函数VS析构函数之间的关系。我的疑问:为什么p出了作用域,指向p的ptr还能读到p中arr的内容,难道p出了作用域,还没有析构?下面的内容会解答这个疑问,先说说跟这篇文章有关的内容。可能是因为平时习惯的原因,我们在实例化一个对象的时候,往往是一条语句实现两个功能:1分配内存;2调用构造函数class A{public: A() { i=0;...阅读全文
posted @ 2013-11-09 09:43 啊汉 阅读(1835) 评论(10) 编辑
摘要: 在软件开发中,有些对象使用非常频繁,那么我们可以预先在堆中实例化一些对象,我们把维护这些对象的结构叫“内存池”。在需要用的时候,直接从内存池中拿,而不用从新实例化,在要销毁的时候,不是直接free/delete,而是返还给内存池。把那些常用的对象存在内存池中,就不用频繁的分配/回收内存,可以相对减少内存碎片,更重要的是实例化这样的对象更快,回收也更快。当内存池中的对象不够用的时候就扩容。我的内存池实现如下:#pragma once#include templatestruct ProxyT{ ProxyT():next(NULL){} T data; ProxyT* ne...阅读全文
posted @ 2013-10-28 08:33 啊汉 阅读(6575) 评论(5) 编辑