
C++
bestone0213
这个作者很懒,什么都没留下…
展开
-
BEGIN_MESSAGE_MAP()参数说明
BEGIN_MESSAGE_MAP()1BEGIN_MESSAGE_MAP(CpassApp, CWinApp)2 ON_COMMAND(ID_HELP, CWinApp::OnHelp)3END_MESSAGE_MAP()这些都是宏定义,不是函数。 在BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()之间添加你的消息响应函数,为每个消转载 2015-05-19 16:43:06 · 12182 阅读 · 0 评论 -
va_list、va_start、va_arg、va_end
我们来看看在vs2008中,它们是怎么定义的: 1: ///stdarg.h 2: #define va_start _crt_va_start 3: #define va_arg _crt_va_arg 4: #define va_end _crt_va_end 5: 6: ///vadefs.h 7: #define转载 2014-12-03 14:47:42 · 516 阅读 · 0 评论 -
C++中的new/delete与operator new/operator delete
new operator/delete operator就是new和delete操作符,而operator new/operator delete是函数。new operator(1)调用operator new分配足够的空间,并调用相关对象的构造函数(2)不可以被重载operator new(1)只分配所要求的空间,不调用相关对象的构造函数。当无法满足所要求分配的空间转载 2014-12-02 17:25:49 · 382 阅读 · 0 评论 -
设计模式——适配器模式(Adapter Pattern)
解决的问题:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。比如说我的hp笔记本,美国产品,人家美国的电压是110V的,而我们中国的电压是220V,要在中国能使用,必须找个变压器转一下电压才可以。这个变压器就是个适配器。适配器模式有类适配器和对象适配器两种模式,我们将分别讨论。类适配器:转载 2014-07-10 17:38:36 · 446 阅读 · 0 评论 -
设计模式——命令模式
我们去餐厅吃饭,我们是通过服务员来点菜,具体是谁来做这些菜和他们什么时候完成的这些菜,其实我们都不知道。抽象之,“菜单请求者”我们和“菜单实现者”厨师,2者之间是松耦合的,我们对这些菜的其他一些请求比如“撤销,重做”等,我们也不知道是谁在做。其实这就是本文要说的Command模式。 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求转载 2014-07-11 09:33:58 · 402 阅读 · 0 评论 -
为什么C语言里不推荐强制转换malloc的返回值?
在C里,用malloc动态分配内存时,是不推荐强转其返回值的。例如int *arr = malloc(sizeof(int) * 5);而不是int *arr = (int *)malloc(sizeof(int) * 5);为什么呢?原因有2:1. C里面从void *到其它类型的指针是自动转换的。例如int n = 1;int *pn = &n;转载 2014-11-05 19:54:24 · 5608 阅读 · 0 评论 -
设计模式——责任连模式
概述: 辛辛苦苦了工作了一年,终于可以加薪了,向主管提交了加薪申请,主管一看不得了,自己职权不够,批不了,主管把申请上交总监,总监发现自己也批不了,申请到了总经理手中,总经理一看,小伙子口气不小了,有胆识敢申请,先来谈下心。预知后事如何,请看下回分解。 这就是典型的职责链模式,请求的处理形成了一条链,直到有一个对象处理请求。责任链模式是一种对象的行为模式。在责任链模转载 2014-07-11 01:11:20 · 428 阅读 · 0 评论 -
设计模式—— 观察者模式
软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍观察者模式的实现。 观察者模式转载 2014-11-25 10:52:19 · 342 阅读 · 0 评论 -
数据库使用--MyISAM InnoDB 区别
MyISAM 和 InnoDB 讲解 InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。 以下是一转载 2014-10-15 10:58:27 · 399 阅读 · 0 评论 -
高性能网络编程(一)----accept建立连接
编写服务器时,许多程序员习惯于使用高层次的组件、中间件(例如OO(面向对象)层层封装过的开源组件),相比于服务器的运行效率而言,他们更关注程序开发的效率,追求更快的完成项目功能点、希望应用代码完全不关心通讯细节。他们更喜欢在OO世界里,去实现某个接口、实现这个组件预定义的各种模式、设置组件参数来达到目的。学习复杂的通讯框架、底层细节,在习惯于使用OO语言的程序员眼里是绝对事倍功半的。以上做法无可厚转载 2014-10-15 16:31:25 · 417 阅读 · 0 评论 -
数据库使用--MySQL: InnoDB 还是 MyISAM?
MyISAM存储引擎 MyISAM是 默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。MyISAM存储引擎的一些特征:· 所有数据值先存储低字节。这使得数据机和操作系统分离。二进制轻便性的唯一要求是机器使用补码(如最近20年的机器有的一样)和IEEE浮点格式(在主流机器中也完全是主导的)。唯一不支持二进制兼容性的机器是嵌入式系统。这些系统有时使用特转载 2014-10-15 10:57:14 · 525 阅读 · 0 评论 -
详解rsync算法--如何减少同步文件时的网络传输量
先看下图中的场景,客户端A和B,以及服务器server都保存了同一个文件,最初,A、B和server上的文件内容都是相同的(记为File.1)。某一时刻,B修改了文件内容,上传到SERVER上(记为File.2)。客户端A这时试图向服务器SERVER更新文件到最新内容,也就是File.1更新为File.2。上面这个场景很常见,例如现在流行的网盘。假设我有一个文件a.txt在网盘转载 2014-10-15 11:52:03 · 448 阅读 · 0 评论 -
ICE 异步方法分批和调用
异步方法调用(Asynchronous Method Invocation,简称AMI)下面这种情况就是AMI调用:“斧头帮”大哥(客户端)叫小弟(服务器端)去干收租的活(远程调用),并且给小弟一把烟花炮竹(回调类)。嘱咐说: “我还有其它事情要打扫打扫,如果你的事情办完了,就放'OK'烟花;如果遇到反抗,就放'斧头'烟花!”(服务器答复)。说完,这位大哥就可以放心的做 其它事去了,直到看到天转载 2014-11-17 15:26:56 · 652 阅读 · 0 评论 -
ICE同步方法调用 java版本
简单的ICE通信应用-Hello World参考《Ice分布式程序设计》马维达一、简述 创建一个非常简单的客户-服务器ice应用。这个应用提供远地打印功能:客户发送要打印的文本给服务器,再由服务器把文本发给打印机。打印程序只是把文本打印到终端,而不是真正的打印机。目的是说明客户怎样与服务器通信。二、安装ICE 下载安装包:http://www.zeroc.com/d转载 2014-11-17 14:11:27 · 1523 阅读 · 0 评论 -
数据库使用2--索引系列
我们首先讨论索引,因为它是加快查询的最重要的工具。还有其他加快查询的技术,但是最有效的莫过于恰当地使用索引了。在 MySQL 的邮件清单上,人们通常询问关于使查询更快的问题。在大量的案例中,都是因为表上没有索引,一般只要加上索引就可以立即解决问题。但这样也并非总是有效,因为优化并非总是那样简单。然而,如果不使用索引,在许多情形下,用其他手段改善性能只会是浪费时间。应该首先考虑使用索引取得最转载 2014-10-14 11:16:43 · 332 阅读 · 0 评论 -
数据库使用3--索引系列
多数数据库,使用 B 树(Balance Tree)的结构来保存索引。 www.2cto.com B 树,最上层节点:根节点最下层节点:叶子节点两者之间的节点:中间节点 B 树,显著特征:从根节点,到各个叶子节点的距离都是相等的。如此,检索任何值时,都经过相同数目的节点。 [sql] CREATE INDEX id转载 2014-10-14 11:17:38 · 358 阅读 · 0 评论 -
数据库使用1--注意事项
书写SQL需要注意的若干问题(MySQL版) 一、基本问题1, 在系统中运行的SQL查询,先考虑一下能不能在Slave上检索,目前各个项目中Master上的不可避免的查询量是其他所有的Slave总和还多。但也不是一味的都是在Slave上查询。系统上出过一次查询数据的情况:在一个前后顺序执行的逻辑代码中,先更新Master的数据,再在Slave上查更新后的数据,这样的操作很多时候转载 2014-10-14 11:17:48 · 406 阅读 · 0 评论 -
epoll有两种模式,Edge Triggered(简称ET)
epoll有两种模式,Edge Triggered(简称ET) 和 Level Triggered(简称LT).在采用这两种模式时要注意的是,如果采用ET模式,那么仅当状态发生变化时才会通知,而采用LT模式类似于原来的select/poll操作,只要还有没有处理的事件就会一直通知. 以代码来说明问题: 首先给出server的代码,需要说明的是每次accept的连接,加入可读集的时候采用转载 2014-12-02 17:27:04 · 3086 阅读 · 0 评论 -
类的operator new与operator delete的重载
为什么有必要写自己的operator new和operator delete?答案通常是:为了效率。缺省版本的operator new是一种通用型的内存分配器,它必须可以分配任意大小的内存块。同样,operator delete也要可以释放任意大小的内存块。operator delete想弄清它要释放的内存有多大,就必须知道当初operator new分配的内存有多大。有一种常用的方法可以转载 2014-12-02 17:42:40 · 390 阅读 · 0 评论 -
C++时间处理
1.概念 Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是格林威治标准时间GMT。 Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。它是“相对时间”,无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。 clock tick:时钟计时单元。一个转载 2014-12-19 20:28:49 · 500 阅读 · 0 评论 -
DECLARE_MESSAGE_MAP( ) 用法
DECLARE_MESSAGE_MAP( ) 说明: 你的程序中的每一个CCmdTarget的派生类都可以提供一个消息映射以处理消息。在你的类声明的末尾使用DECLARE_MESSAGE_MAP宏。然后,在实现了类成员函数的.CPP文件中加入BEGIN_MESSAGE_MAP宏,再加入每个消息处理函数的宏入口,最后使用END_MESSAGE_MAP宏。 注意: 如果你在DE转载 2015-05-19 16:45:33 · 2055 阅读 · 0 评论 -
VC++宽字符TCHAR用法三
引言毫无疑问,我们都看到过像 TCHAR, std::string, BSTR 等各种各样的字符串类型,还有那些以 _tcs 开头的奇怪的宏。你也许正在盯着显示器发愁。本指引将总结引进各种字符类型的目的,展示一些简单的用法,并告诉您在必要时,如何实现各种字符串类型之间的转换。在第一部分,我们将介绍3种字符编码类型。了解各种编码模式的工作方式是很重要的事情。即使你已经知道一个字符串是转载 2015-05-20 10:23:36 · 3576 阅读 · 0 评论 -
TCHAR用法
TCHAR 就是当你的字符设置为什么就是什么例如:程序编译为 ANSI, TCHAR 就是相当于 CHAR当程序编译为 UNICODE, TCHAR 就相当于 WCHARchar :单字节变量类型,最多表示256个字符,wchar_t :宽字节变量类型,用于表示Unicode字符,它实际定义在里:typedef unsigned short wchar_t。转载 2015-05-20 10:21:17 · 31486 阅读 · 4 评论 -
VC++中的char,wchar_t,TCHAR用法
总体简介:由于字符编码的不同,在C++中有三种对于字符类型:char, wchar_t , TCHAR。其实TCHAR不能算作一种类型,他紧紧是一个宏。我们都知道,宏在预编译的时候会被替换成相应的内容。TCHAR 在使用多字节编码时被定义成char,在Unicode编码时定义成wchar_t。1.VC++中的char,wchar_t,TCHAR 大家一起做一个项目,经常发现有的人爱转载 2015-05-20 10:21:25 · 3975 阅读 · 0 评论 -
Dword、LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR
L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。即win32中,long,near,far指针与普通指针没有区别,LP 与P是等效的。P表示这是一个指针。T表示_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义转载 2015-05-14 17:20:16 · 518 阅读 · 0 评论 -
VC++中字符串编码的转换
在以前VC++6.0中默认的字符集是多字节字符集(MBCS:Multi-Byte Character Set),而VS2005及以后默认的字符集是Unicode,这样导致以前在VC6.0中非常简单实用的各类字符操作和函数在VS2010环境下运行时会报各种各样的错误。字符集可以通过工程属性修改:“工程-属性-字符集”。CString在Unicode和多字节字符集下的区别:CStrin转载 2015-05-14 18:02:29 · 465 阅读 · 0 评论 -
explicit关键字
在C++程序中很少有人去使用explicit关键字,不可否认,在平时的实践中确实很少能用的上。再说C++的功能强大,往往一个问题可以利用好几种C++特性去解决。但稍微留心一下就会发现现有的MFC库或者C++标准库中的相关类声明中explicit出现的频率是很高的。了解explicit关键字的功能及其使用对于我们阅读使用库是很有帮助的,而且在编写自己的代码时也可以尝试使用。既然C++语言提供这种特性转载 2015-03-12 16:27:58 · 430 阅读 · 0 评论 -
sizeof的使用
说明:以下代码在VS2008中通过,在32位操作系统下。1. 定义sizeof是一个操作符(operator)。其作用是返回一个对象或类型所占的内存字节数。其返回值类型为size_t。(size_t在头文件stddef.h中定义,它依赖于编译系统的值,一般定义为 typedef unsigned int size_t;)2. 语法sizeof有三种语法形转载 2015-03-12 16:27:34 · 427 阅读 · 0 评论 -
ice服务器实现技术
1. 渐进的初始化如果我们使用servant定位器,locate返回的servant只能用于当前请求,也就是说Ice run time不会把这个servant增加到Active Servant Map中。一种常用的实现技术是,在locate中,把每个servant增加到ASM中。这意味着,只有对Ice对象的初次请求会触发对locate的调用;自此之后,与Ice对象对应的转载 2015-03-19 11:57:41 · 3657 阅读 · 0 评论 -
ICE线程类多线程
http://blog.youkuaiyun.com/moxiaomomo/article/details/6732387线程1.Thread类 1.1概述 Ice中的基础线程是由ThreadControl类和Thread类来提供的(在IceUtil/IceUtil.h中定义): Thread类是一个抽象基类,拥有一个纯虚方转载 2015-03-19 11:51:57 · 1426 阅读 · 0 评论 -
Ice读书笔记--- TreadControl类的join与detach方法
http://blog.youkuaiyun.com/moxiaomomo/article/details/6732387在Ice中创建线程很简单,假设有一个名为ReaderThread的线程类,则可以这样创建线程: class ReaderThread : public IceUtil::Thread { virtual void run() {转载 2015-03-19 11:49:39 · 415 阅读 · 0 评论 -
C++线程与并发
Ice 提供了一个简单的线程抽象层,用以编写可移植的多线程程序。通过同步原语可以实现不同粒度的并发控制。1、互斥体 IceUtil::Mutex类和IceUtil::StaticMutex提供了简单的非递归互斥机制。两者完全类似,只是StaticMutex可以静态声明,如下所示:static IceUtil::StaticMutex myStaticMutex =ICE_STATI转载 2015-03-19 11:54:52 · 661 阅读 · 0 评论 -
operator=返回一个reference to *this
在C++中,调用拷贝构造函数有三种情况:1.一个对象作为函数参数,以值传递的方式传入函数体.2.一个对象作为函数返回值,以值传递的方式从函数返回.3.一个对象用于给另外一个对象进行初始化(复制初始化).拷贝构造函数必须以引用的形式传递(参数为引用值).其原因如下:当一个对象以传递值的方式传一个函数的时候,拷贝构造函数自动的调用来生成函数中的对象.这样转载 2015-01-04 14:12:40 · 570 阅读 · 0 评论 -
std::vector的reserve和resize的区别
1. reserve: 分配空间,更改capacity但不改变size2. resize: 分配空间,更改capacity也改变size如果知道vector的大小,resize一下可以当数组来用,不会分配多余的内存。 reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用容器内的元素,因此当加入新的元素时,需要用push_back()/inser转载 2015-01-19 17:39:05 · 14194 阅读 · 1 评论 -
ICE回调机制。
使用分布式计算中间件ICE到现在已经有一年多了,在这一年里里面对ICE的理解、应用比较熟悉。 使用ICE写分布式软件,确实是很方便:ICE比较稳定、可靠,调用返回速度低延迟,使用简单,学习曲线不是很陡。 总之利用ICE开发分布式软件,是一个可行的选择。 在实际的过程中,ICE客户端跟服务端的数据流动是单项的,也就是客户端获取服务端的一个代理,从而与服务端进行转载 2014-12-13 12:36:04 · 1516 阅读 · 0 评论 -
C++运算符重载
C++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁、高效。在c++中不止函数可以重载,运算符也可以重载。由于一般数据类型间的运算符没有重载的必要,所以运算符重载主要是面向对象之间的。1.一般运算符重载在进行对象之间的运算时,程序会调用与运算符相对应的函数进行处理,所以运算符重载有两种方式:成员函数和友元函数。成员函数的形式比较简单,转载 2014-12-08 20:38:44 · 391 阅读 · 0 评论 -
解决Ice 对象大数据量传输Bug
这两天,上司给了一个之前版本的Bug,说是在现场发现的,让尽快解决。由于公司项目管理上并不规范,Bug描述信息很少,主要给了简短的文字描述,和bug发生时界面截图,连复现bug的步骤都没有,最初只是当作性能bug对待的。以下是复现、解决bug的过程。 通过分析,主要是认为ICE对象之间传输的数据量过大导致的问题,因此,搭建了环境,并制造了大数据量传输的情形,问题复现还算顺利。但调试、修复转载 2014-11-14 10:20:08 · 3906 阅读 · 0 评论 -
free之后要记得指针置空
别看 free 和delete 的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。 用调试器跟踪示例程序,发现指针p 被free 以后其地址仍然不变(非NULL),只是该地址对应的内存是垃圾,p 成了“野指针”。如果此时不把p 设置为NULL,会让人误以为p 是个合法的指针。 如果程序比较长,我们有时记不住p 所指的内存是否已经被释转载 2014-11-14 17:46:17 · 13894 阅读 · 0 评论 -
一个进程(Process)最多可以生成多少个线程(Thread)
1.进程中创建线程的限制默认情况下,一个线程的栈要预留1M的内存空间,而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程,但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。#define MAX_THREADS 50000#include Windows.h>#include stdio.h>DWOR转载 2014-11-13 17:32:05 · 6977 阅读 · 0 评论 -
PostMessage与SendMessage的区别(二)
在做基于窗口的Windows程序的时候,我们避免不了要向窗口发送消息,有两种方式,一种是PostMessage,另外一种是SendMessage。关于这两个宏,我是通过狠狠的看MSDN才搞明白的,那里讲的是最权威的。它们的区别如下:1、PostMessage会将消息压入窗口所在线程的消息队列,然后返回;而SendMessage则不经过消息队列,SendMessage可认为是直接调用了该窗口的窗转载 2014-06-20 00:07:50 · 549 阅读 · 0 评论