摘要: 程序员的收入是广受关注的问题,很多人从业3~5年之后就会遇到这个收入瓶颈。尽管物价不断上涨,程序员尤其是初、中级程序员的收入不升反降。即使上次在某个文章中看到有中国第一程序员之称的某位,月薪也只有3万,尽管这个数字已经很高了,但这个“中国第一”,也只有众多小型软件企业总监级别的收入而已。为什么这么高... 阅读全文
posted @ 2014-06-04 21:53 大卫酱_David 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 从VC++6.0不足看VisualC++2010新特性 说起VC,有人想到维生素C(维C),有人想到风险投资(venture capital), 程序员们尤其是做底层开发的程序员或老程序员们第一感觉肯定会想到Visual C++6.0。为什么是6.0而不是其它的版本?这里的原因就不用我再多讲了,因... 阅读全文
posted @ 2014-05-02 09:44 大卫酱_David 阅读(495) 评论(0) 推荐(0) 编辑
摘要: 一、简介 VLC的全名是Video Lan Client,是一个开源的、跨平台的视频播放器。VLC支持大量的音视频传输、封装和编码格式,完整的功能特性列表可以在这里获得http://www.videolan.org/vlc/features.html,下面给出一个简要的不完整的列表: 操作系统:Wi... 阅读全文
posted @ 2014-04-22 13:16 大卫酱_David 阅读(1525) 评论(0) 推荐(0) 编辑
摘要: C++标准库的开发,几乎所有东西都被设计为模板形式,所以掌握Template技术是学习标准库的基础。回顾下Template,它是一种针对“一个或多个尚未明确类型”所编写的函数或类别,其中共性是逻辑相同,异处在于该逻辑中使用到的类型需要用户自己设定。当然,我们在使用Template时,可以“显式exp... 阅读全文
posted @ 2014-04-21 11:38 大卫酱_David 阅读(278) 评论(0) 推荐(0) 编辑
摘要: (一)inline函数(摘自C++ Primer的第三版)在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。 inline int min(int first, int secend) {/****/}; inline 函数对编译器而言必须是可见的,以便它能够在调用点内... 阅读全文
posted @ 2014-04-21 09:46 大卫酱_David 阅读(3555) 评论(1) 推荐(0) 编辑
摘要: C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。一、Const作用如下表所示:No.... 阅读全文
posted @ 2014-04-17 17:10 大卫酱_David 阅读(889) 评论(0) 推荐(0) 编辑
摘要: C++的虚函数的作用就是为了实现多态的机制,利用内存的指针偏移来实现将基类型的指针指向的内存空间用子类对象来初始化。这样经过内部虚表的运作,实现可以通过基类指针来调用子类所定义的方法。这种技术,其实就是一种泛型技术,试图让不变的代码来实现可变的算法。比如:模板、RTTI、虚函数。实现在编译时决定方法... 阅读全文
posted @ 2014-04-17 15:21 大卫酱_David 阅读(2060) 评论(1) 推荐(1) 编辑
摘要: 有3种情况,可以将一个object的内容作为另外个object的初值: 1. 明确的拷贝:X c_x2; X c_x = c_x2; 2. 函数参数:void foo(X xx); 3. 函数返回值:X foo() { X xx; return xx;}; 假如类的设计者定义了一个拷贝构造,比如: X::X( const X &x); Y::Y( const Y &y, int = 0); 那么... 阅读全文
posted @ 2014-04-08 20:07 大卫酱_David 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 看下面这段代码: 1 class Foo 2 { 3 public: 4 int val; 5 Foo *pnext; 6 }; 7 8 void foo_bar() 9 {10 Foo bar;11 if(bar.val || bar.pnext)12 //do something....13 };在C++ARM中作者说道:“C++构造函数... 阅读全文
posted @ 2014-04-08 14:09 大卫酱_David 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 1 前言我在本文中详细介绍了测试工具NuMega Devpartner(以下简称NuMega)的使用方法。NuMega是一个动态测试工具,主要应用于白盒测试。该工具的特点是学习简单、使用方便、功能有效。NuMega共有三个独立的子功能——BoundsChecker、TrueCoverage、TrueTime。BoundsChecker为代码检错工具,TrueCoverage为测试覆盖率统计工具,TrueTime为程序运行性能测试工具。本文挡通过三章对NuMega三个子功能的使用方法进行了介绍,各部分之间内容独立。如果你想了解NuMega的各项功能,建议阅读本文挡全部内容,如果你只想了解NuMe 阅读全文
posted @ 2014-04-02 00:09 大卫酱_David 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 1 引子标准C++中没有真正的面向对象的函数指针。这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值。在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础。而在目前,C#使“委托”的概念日趋流行,这也正显示出C#这种语言的成功。在很多应用程序中,“委托”简化了松耦合对象的设计模式[GoF]。这种特性无疑在标准C++中也会产生很大的作用。很遗憾,C++中没有“委托”,它只提供了成员函数指针(m 阅读全文
posted @ 2014-04-01 15:30 大卫酱_David 阅读(471) 评论(0) 推荐(0) 编辑
摘要: Sink的本质是利用C++的封装、继承、多态的面向对象来实现,从实现角度来说,更优于函数指针回调; 1 // cbBysink.cpp : Defines the entry point for the console application. 2 // 3 4 #include "stdafx.h" 5 #include "cbBysink.h" 6 7 /***************... 阅读全文
posted @ 2014-04-01 13:13 大卫酱_David 阅读(2471) 评论(0) 推荐(0) 编辑
摘要: 1 #include 2 using namespace std; 3 4 5 /************************************************************************/ 6 /* 下层实现: CALLBACK */ 7 /************************************************************************/ 8 9 typedef void (*CALLBAC... 阅读全文
posted @ 2014-04-01 10:54 大卫酱_David 阅读(242) 评论(0) 推荐(0) 编辑
摘要: 模板编程,也叫“通用编程”或“泛型编程”,泛型编程即独立于任何特定类型的方式编写代码。一般而言,模板分为:函数模板 和 类模板。1. 函数模板模板函数的定义格式:template 返回类型 函数名(函数参数列表) { 函数实现 };template int function(T a, T b){ if (a b) return 1;}函数模板的使用方式:函数模板使用时,编译器会先判断哪个模板实参绑定到模板实参,一旦编译器确定了实际的模板实参,就称为实例化了函数模板的一个实例。 1 int main(int argc, char* argv[]) 2 { 3 int a = 1;... 阅读全文
posted @ 2014-03-21 15:11 大卫酱_David 阅读(280) 评论(0) 推荐(0) 编辑
摘要: 在我还不太懂设计模式的时候,代码写的非常混乱,往往都是拍拍脑袋就写代码,写到哪里算哪里,不行就往死里改,效率低下。当然学习设计模式的过程也十分有趣,可是说是建立自己设计思维的基石。在学习的时候,不但要充分思考这样设计的方案好在哪里差在哪里,更关键的是,要动手去写,否则只是理解表层的东西,很难做到融会贯通。学习设计模式的过程:1. 创建型模式2. 结构型模式3. 行为模式现在,我们就先从创建型模式开始:所谓创建型模式,就是指构建类对象。帮助系统隔离开“如何创建?”、“如何组合?”、“表示的对象?”。我们既然使用了C++,就需要充分使用面向对象的优越性,那就是通过封装、继承、多态来把程序的耦合度降 阅读全文
posted @ 2014-03-21 12:58 大卫酱_David 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 早就听说qt可以集成到VS中,就是一直没尝试过。一直在使用qt creator,也没觉得它有什么不好。可最近VS用多了,我发现一个qt creator中很不好的毛病,就是代码自动完成时,creator要程序员敲enter;而VS只需按下空格键。可别小看这小小区别,对于习惯于五笔打字姿势的我而言,按空格可真是方便多了。于是这会儿才想把qt集成到VS中,当作练习练习。查了网上很多教程,发现很多人选择用VS去编译qt源码,一个nmake下去就得要4,6个小时,最后还不一定成,中间还这么多问题,我实在不太想这么搞。于是去仔细查看官方下载软件包,发现在win32平台上有两种区分:mingw和msvc,且 阅读全文
posted @ 2014-03-20 22:28 大卫酱_David 阅读(816) 评论(0) 推荐(0) 编辑
摘要: 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,日文,中文等等。这两天学习了一下二维码图片生成的相关细节,觉得这个玩意就是一个密码算法,在此写一这篇文章 ,揭露一下。供好学的人一同学习之。关于QR Code Specification,可参看这个PDF:http://raidenii.net/files/datasheets/misc/qr_code.pdf基础知识首先,我们先说一下二维码一共有40个尺寸。官方叫版本Version。Versio 阅读全文
posted @ 2014-03-20 13:09 大卫酱_David 阅读(2716) 评论(1) 推荐(2) 编辑
摘要: 类似于Mutex,但信号量Semaphores不仅仅是锁和解锁那么简单,更高级的是,可以被锁住最多n次。其中这个n是信号量被产生时指定的n。该值常常被用来代表“可以锁定住一份资源”的线程个数。可以把Mutex比作厕所,当一个人进去后,其他人只能等待;可以把信号量看作是多个Mutex(多个厕所),反正就3个厕所(一个入口,3个坑),无论等待的有多少人,反正想进去必须等到里面出来一个(如果里面满了);在许多系统中,常常使用的是信号量而非Mutex,因为它不一定存在。但是在win32中,我们更多的使用Mutex而不是信号量,Mutex方便嘛,当然用信号量也是可以的。常用的信号量接口:1. 产生信号量 阅读全文
posted @ 2014-03-19 17:39 大卫酱_David 阅读(416) 评论(0) 推荐(0) 编辑
摘要: 互斥器的功能是,使多个线程和谐工作。同一时间内,只能有一个线程得到互斥对象,并获得资源操作权限,那么如果同一时间其他线程也想去操作资源,此时就会因为Mutex未处于激发状态,而无奈的等待…这时候,线程就会进入blocking(阻塞)状态,直到Mutex让出来。总结下Mutex的操作步骤,分为以下几个功能:1. 产生一个全局互斥器Mutex(一个Mutex可以看做一个资源,如果要多个资源,则需要创建多个Mutex句柄);2. 锁住互斥器Mutex:获得一个Mutex的拥有权,其他线程只能等待。当需要锁操作时,如果此时锁未处于激活状态,线程就得等待(也就是阻塞状态/sleep)并每隔一段时间尝试着 阅读全文
posted @ 2014-03-19 10:57 大卫酱_David 阅读(3574) 评论(0) 推荐(0) 编辑
摘要: 介绍内联函数之前,有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏,我们会经常定义一些宏,如#define TABLE_COMP(x) ((x)>0?(x):0)就定义了一个宏。 为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开销, 阅读全文
posted @ 2014-03-18 15:57 大卫酱_David 阅读(224) 评论(0) 推荐(0) 编辑
摘要: 标准C++包含一个显式的转换语法:--static_cast:用于“良性”和“适度良性”的转换,包括不用强制转换--const_cast:用于“const”和/或“volatile”进行转换--reinterpret_cast:转换为完全不同的意思。为了安全的使用它,关键必须转换回原来的类型。转换成的类型一般只能用于位操作,否则就是为了其他隐秘的目的。这是所有转换中最危险的。--dynamic_cast:用于类型安全的向下转换-----常用-----static_cast:用于所有明确定义的转换,包括void*的强制转换、隐式类型转换、类层次的静态定位。1. 数据类型由小到大的转换,比如int 阅读全文
posted @ 2014-03-18 14:16 大卫酱_David 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 线程的重要特性就在于,如何让多个线程之间互相合作,而不是争吵罢工。同步(synchronous):当程序1调用程序2时,程序1停下来不动,直到程序2完成回到程序1来,程序1才继续下去,那么两者的关系就是同步;异步(asynchronous):如果程序1调用程序2时,经自继续自己的下一个动作,那么两者之间的关系就是异步;win32中关于进程和线程的协调工作是由同步机制来完成。临界区域:所谓临界区域就是指用来处理一份被共享的资源的程序代码。必须对临界区域进行保护,一次只能有一个线程获准进入该区域内进行操作。一般代码中可以为需要保护的资源,声明一个CRITICAL_SECTION类型的变量,让其扮演 阅读全文
posted @ 2014-03-18 13:40 大卫酱_David 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 对于普通类型的对象来说,他们之间的复制是简单的,比如: int a = 88; int b = a; 而类和普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。 #include using namespace std;class CExample {private: int a;public: CExample(int b) { a=b;} void Show () { coutusin... 阅读全文
posted @ 2014-03-18 11:05 大卫酱_David 阅读(131) 评论(0) 推荐(0) 编辑
摘要: extern是一个关键字,它告诉编译器存在着一个变量或者一个函数,如果在当前编译语句的前面中没有找到相应的变量或者函数,也会在当前文件的后面或者其它文件中定义,来看下面的例子:上面代码中变量i和函数func在文件末尾定义,所以变量需要使用extern关键字告诉编译器,变量在别的地方定义。extern int i我原来以为extern i就可以,结果编译器报错,仔细想下确实应该,否则编译器不知道i是什么类型的数据,又怎么能判断i = 0是否是一个正确的赋值语句呢?那么定义在其他文件中的函数和变量,如何通过extern关键字调用呢?首先,定义在其它文件中的函数和变量,可以使用两种方法调用:一、使用 阅读全文
posted @ 2014-03-17 16:52 大卫酱_David 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 析构函数的工作方式是:最底层的派生类(most derived class)的析构函数最先被调用,然后调用每一个基类的析构函数。--从高到低依次析构…因为在C++中,当一个派生类对象通过使用一个基类指针进行删除(B::A; A *a = new B(); delete a),而这个基类有一个非虚的析构函数,则结果是未定义的。运行时比较有代表性的后果是对象的派生部分不会被销毁。然而,基类部分很可能已被销毁,这就导致了一个古怪的“部分析构”对象,这是一个泄漏资源。排除这个问题非常简单:给基类一个虚析构函数。于是,删除一个派生类对象的时候就有了你所期望的正确行为。将销毁整个对象,包括全部的派生类部分 阅读全文
posted @ 2014-03-17 11:11 大卫酱_David 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 和其他类一样,基类或派生类可以使其他类或函数成为友元。---(被友元的类和函数需另自行定义)友元可以访问类的private和protected数据,但不能继承,基类的友元对派生类的成员没有特殊访问权限。比如有个类:class Base{ friend class Frnd;protected: int i;};// Frnd并非类D1的友元类:class D1 : public Base{protected: int j;};class Frnd{public: int mem(Base b) {return b.i; } // OK int mem(D1 d){return d.i; } / 阅读全文
posted @ 2014-03-15 14:27 大卫酱_David 阅读(446) 评论(0) 推荐(0) 编辑
摘要: 在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高 阅读全文
posted @ 2014-03-15 13:23 大卫酱_David 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 为什么需要线程池?目前大多数服务器,包括WEB服务器、Email服务器以及数据库服务器等都具有一个共同点,就是单位时间内必须处理巨大的连接请求,但处理时间却相对较短。传统多线程方案里,我们采用的服务器模型是一旦接受了请求之后,就创建一个新的线程,由该线程来处理任务。任务执行完毕后,线程退出,这就是“即时创建,即时销毁”的策略。尽管与创建进程相比,创建线程的时间已经大大的缩短了,但是如果提交线程的任务是执行时间较短,而且执行次数及其频繁,那么服务器将处于一个不停创建线程,销毁线程的状态。时间划分?我们将传统方案中的线程执行过程划分为3个时间段:T1,T2,T3:T1:线程创建时间;T2:线程执行 阅读全文
posted @ 2014-03-13 16:51 大卫酱_David 阅读(235) 评论(0) 推荐(0) 编辑
摘要: _MSC_VER是微软的预编译控制。_MSC_VER可以分解为:MS:Microsoft的简写。C:MSC就是Microsoft的C编译器。VER:Version的简写。_MSC_VER的意思就是:Microsoft的C编译器的版本。微软不同时期,编译器有不同的版本:MS VC++10.0 _MSC_VER=1600MS VC++9.0 _MSC_VER=1500MS VC++8.0 _MSC_VER=1400......其中MS VC++10.0就是Visual C++ 2010,MS VC++9.0就是Visual C++2008,MS VC++8.0就是Visual C++2005在程序 阅读全文
posted @ 2014-03-13 11:16 大卫酱_David 阅读(402) 评论(0) 推荐(0) 编辑
摘要: 在使用一些新版本的API,或者控件的新特性(比如新版的ComCtl32.dll)的时候,你可能会得到“error C2065: undeclared identifier.“这个错误。原因是这些功能是依赖于你的操作系统的版本的。而你的头文件中的定义并不是最新的。(对于MFC,就是stdafx.h)下面详细列举了每个Windows版本对应的NTDDI_VERSION,_WIN32_WINNT,WINVER,_WIN32_IE这些宏。NTDDI_VERSION:Minimum system required Macros to defineWindows Server 2008 NTDDI_VER 阅读全文
posted @ 2014-03-13 11:08 大卫酱_David 阅读(3904) 评论(0) 推荐(0) 编辑