随笔分类 - [30]C++
-
透彻了解inline以及降低编译依存关系
摘要:透彻了解inline以及降低编译依存关系inline内敛1.类似于C中的#define 在C++中,提供了inline函数来代替C中的宏定义。(通常可以使用const来代替单纯变量的宏定义,它可以提供类型检查。对于形似函数的宏,最好改用inline函数来替换宏定义。) 编译器最优化机制通常被设计用来浓缩那些“不含函数调用“的代码,所以当你inline某个函数时,或许编译器就因此有能力对它执行语境相关最优化。2.效率问题 inline函数同#define宏定义一样,都是以函数本体做替换,这样做可能增加你的目标码(object code),从而可能造成代码膨胀(代码膨胀会导致额外的换页行为,... 阅读全文
-
C++在VS下创建、调用dll
摘要:C++在VS下创建、调用dll1.dll的优点代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,ATL、MFC等,它们都以源代码的形式发布。由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”。“白盒复用”的缺点比较多,总结起来有4点。暴露了源代码;多份拷贝,造成存储浪费;容易与程序员的“普通”代码发生命名冲突;更新功能模块比较困难,不利于问题的模块化实现;实际上,以上4点概括起来就是“暴露的源代码”造成“代码严重耦合”。为了弥补这些不足,就提出了“二进 阅读全文
-
ffrpc-c++进程间(服务器端、客户端)通信框架
摘要:ffrpc-c++进程间(服务器端、客户端)通信框架FFRPCgithub 地址https://github.com/fanchy/FFRPCFFRPC 已经陆陆续续开发了1年,6月6日这天终于完成了我比较满意的版本,暂称之为 V0.2,FFRPC实现了一个C++版本 的异步进程间通讯库。我本身是做游戏服务器程序的,在服务器程序领域,系统是分布式的,各个节点需要异步的进行通信, 我的初衷是开发一个易用、易测试的进程间socket通信组件。实际上FFRPC 已经是一个框架。FFRPC 主要特性FFRPC 采用Epoll Edge Trigger模式,这里特别提一下ET是因为在异步工作模式,ET方 阅读全文
-
C++的性能优化实践
摘要:C++的性能优化实践优化准则:1. 二八法则:在任何一组东西中,最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的;在优化实践中,我们将精力集中在优化那20%最耗时的代码上,整体性能将有显著的提升;这个很好理解。函数A虽然代码量大,但在一次正常执行流程中,只调用了一次。而另一个函数B代码量比A小很多,但被调用了1000次。显然,我们更应关注B的优化。2. 编完代码,再优化;编码的时候总是考虑最佳性能未必总是好的;在强调最佳性能的编码方式的同时,可能就损失了代码的可读性和开发效率;工具:1 Gprof工欲善其事,必先利其器。对于Linux平台下C++的优化,我们使用gprof 阅读全文
-
关于计算程序运行时间的方法汇总
摘要:关于计算程序运行时间的方法汇总1、GetTickCount()函数1.1 函数介绍 该函数是windows里面常用来计算程序运行时间的函数;1.2 使用方法: DWORD dwStart = GetTickCount(); //这里运行你的程序代码 DWORD dwEnd = GetTickCount(); 则(dwEnd-dwStart)就是你的程序运行时间, 以毫秒为单位。这个函数只精确到55ms,1个tick就是55ms。1.3 代码示例 1 #include <iostream> 2 #include <windows.h> 3 using namespace 阅读全文
-
Effective C++尽量少做转型动作
摘要:Effective C++学习之--------尽量少做转型动作正如C++之父所说,在C++中应该尽量少做类型转换,太多的类型转换是一种设计不合格的表现。下面就一起来学习一下Effective C++中对这一条的总结吧,我觉得首先需要C++里面的几种类型转换稍作说明: const_cast:和CV限定相关,在实际代码中很少看到使用const_cast的,如果你真的希望在const 函数中改变某个成员变量的话可以将他定义为mutable。恩,还有非cosnt 装换为cosnt 呢?我是没遇到过。 dynamic_cast:当你希望做该种类型转换时可能希望是在一个derived class上执.. 阅读全文
-
一个月掌握VC++2010?
摘要:一个月掌握VC++2010?我个人对C++毫无概念,但在实际做项目的时候,仅仅用了一个月的时间,在完成当月工作的同时,就能够没有障碍进行相当复杂的应用开发。这个过程耗时之短或许不可思议,但采纳同样的方法,相信所有程序员都能够做到。这种方法说白了,就是边学边干。对,就是很多培训机构强调的,在实际项目中学习。不过,略有不同的,是我更加强调以下几点: 1、绝不做成学习项目:即使是最简单的功能,要做成实际产品级别,这意味着几乎成倍的时间投入。 2、每个阶段只面对最少的知识点:只学习需要的东西。 3、项目不断延伸的时候,掌握知识的范围开始扩大,但此时已经具备一定的基础,学习难度已经降低。 我用来学习的功 阅读全文
-
VC6.0开发OCX按钮控件
摘要:VC6.0开发OCX按钮控件VC6.0开发OCX按钮控件0前言1、OCX是典型的ActiveX控件,常见的OCX控件有很多,IE浏览器、Word、Excel等都提供各种各样的OCX控件。2、OCX控件的优点是可以在其他应用程序中嵌入使用。OCX控件做为插件、外挂式的应用非常灵活方便。3、一般用的比较多的是做为视频、图片、图表等显示区域控件。最近碰到几个按钮的功能要封装成OCX控件,供其它程序使用。网上大概搜索了下,资料不多,于是自己写了下来,以供查找。1 创建OCX项目1、打开VC6.0,创建MFC ActiveX项目,工程名称:OcxDemo。2、按照向导步骤操作,点击“完成”创建项目成功。 阅读全文
-
示例代码和工具组件(Java 和 C++)
摘要:示例代码和工具组件(Java 和 C++)*** Java ***1、Java 全能高效 MVC & REST 开发框架Portal-Basic2、Java 日志切割清理工具Log-Cutter*** C++ ***1、通用高性能 Windows Socket 组件HP-Socket2、Windows C++ 应用程序通用日志组件VC-Logger一、Java1、Java 全能高效 MVC & REST 开发框架 Portal-BasicPortal-Basic 是一套功能完备的高性能 Full-Stack Web 应用开发框架,内置可扩展的 MVC Web 基础架构和 DAO 阅读全文
-
虚拟多重继承的C++对象内存模型
摘要:虚拟多重继承的C++对象内存模型关于C++对象内存布局的资料和书籍也有很多,比如陈皓老师的博客:1、C++对象的内存布局(上)2、C++对象的内存布局(下)白杨:RTTI、虚函数和虚基类的实现方式、开销分析及使用指导左手为你画猜:C++类对象内存模型与成员函数调用分析(上、中、下)关于讲解C++对象内存模型最好的书应该是侯捷老师翻译的《深度探索C++对象内存模型》。这两天在看其他书籍时,对C++中虚拟继承的实现机制不太理解,于是又重新翻回《深度探索C++对象内存模型》一书,并结合C++对象的内存布局(下)一文。在Visual Studio 2010下用“cl”编译器进行测试,查看虚拟多重继承下 阅读全文
-
non-member,non-friend替换member函数
摘要:non-member,non-friend替换member函数C++中资源是按照对象的方式来管理的。就拿我们正在使用的Browser来说,他管理各种各样的资源,其中包括cache,浏览记录,下载的历史记录,Cookies记录以及一些webapp的本地记录。我有个习惯就是会定期的清理一下这些资源。现在就来看看Effective C++中给的一些设计建议吧。我们可以不假思索的写出以下的类来:class WebBrowser {public: ...... void clearCache(); void clearHistory(); void clear... 阅读全文
-
C++的高效从何而来2
摘要:C++的高效从何而来(二)之前就写过一篇博客《C++的高效从何而来》,分析C++中效率问题。最近在Herb Sutter(C++标准委员会的chair)的GotW中看到了这篇文章GotW #2: Temporary Objects (5/10),主要是讲C++中临时对象的问题,文章给出了一段代码,问读者有多少处地方产生了不必要的临时对象。代码如下:string find_addr( list<employee> emps, string name ) { for( auto i = begin(emps); i != end(emps); i++ ) { if( *i ==... 阅读全文
-
代码与工具(C++)
摘要:代码与工具(C++)【★更新★】整理发布本人所有博文中提供的代码与工具(C++) (有些内容已更改,重新编辑整理并再次发布,望见谅) 为了更方便地管理博文中涉及的各种代码与工具资源,现在把这些资源迁移到 Google Code 中,有兴趣者可前往下载。C++1、《【五一呈献】通用高性能 Windows Socket 组件 HP-Socket v2.1.1 正式发布》 《基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现》 《通用异步 Windows Socket TCP 客户端组件的设计与实现》 摘要:编写 Windows Socket T... 阅读全文
-
记录下内存分配相关的一些文章资料
摘要:记录下内存分配相关的一些文章资料这两天线上的一个服务出现了内存问题,表现在使用top查看进程的RES会间断性的突然上升,而且从不下降。仔细review了线上的代码,没有发现内存泄漏,怀疑和glibc的内存分配机制有关,glibc并没有及时将内存释放给操作系统。可以自行使用如下的测试代码进行下验证,会发现使用默认的glibc和google提供的tc_malloc,map吃掉的内存在离开自己的scope后并没有吐给操作系统,使用jemalloc没有如上问题。线上的代码已经重新用jemalloc编译推动上线了,还处在观察阶段。#include <malloc.h>#include < 阅读全文
-
STL学习笔记--排序算法
摘要:STL学习笔记--排序算法排序算法 C++ STL 的排序算法(Sorting algorithms)是一组将无序序列排列成有序序列的模板函数或与排序相关的模板函数,提供了排序、折半搜索、归并、集合操作、堆操作、最值求解、字典比较和排列组合等功能。 排序算法一般要求容器提供随机访问迭代器,一般适用于序列容器,如向量容器、队列容器和字符串容器等,但不适用于内部数据结构较为复杂的关联容器,如集合容器、映照容器、哈希集合容器和哈希映照容器等(有些容器是 SGI C++ STL里面的,在编译器自带的STL里面没有,这里不深入讨论,有兴趣的可以自己查相关资料)。目录:元素入堆 push_heap创建堆 阅读全文
-
理解NetworkSocket之TcpServerBase<TDataEvenArgs>
摘要:理解NetworkSocket之TcpServerBase<TDataEvenArgs>前言本小节是NetworkSocket系列的第9小节,在阅读本小节之前,您可能需要先阅读前面的几个小节,否则可能觉得内容跳转比较大。描述TcpServerBase<TDataEvenArgs>是所有Tcp服务器对象的基础类,它将固有的客户端连接监听、在线客户端对象维护、客户端连接断开、关闭客户端连接这些操作已经封装好,对于具体协议的服务器,只要派生于此类,编写协议描述就可以了。类图设计思路性能:TcpServerBase<TDataEventArgs>使用SocketAs 阅读全文
-
STL学习笔记--数值算法
摘要:STL学习笔记--数值算法数值算法 C++ STL 的数值算法(Numeric algorithms)是一组对容器元素进行数值计算的模板函数,包括容器元素求和 accumulate 、两序列元素的内积 inner_product 、容器元素的一系列部分元素和 partial_sum 、容器每对相邻元素的差。应用 accumulate 算法求数组元素和、元素积 1 /* 下面示例程序对数组 iArray={1, 2, 3, 4, 5}进行元素求和、求积 2 */ 3 ----------------------------------------------- 应用 accumulate... 阅读全文
-
STL学习笔记--变易算法
摘要:STL学习笔记--变易算法变易算法 C++ STL 的变易算法 (Mutating algorithms) 是一组能够修改容器元素数据的模板函数,可进行序列数据的复制、交换、替换、填充、移除、旋转、随机抖动和分割。这些算法对迭代器有较高的要求,具体的迭代器类型随各个算法而定,或前向迭代器、或双向迭代器、又或者是随机迭代器,以提供算法所需要的迭代器操作。应用变易算法时,先要检查容器的迭代器是否符合要求,防止产生编译错误。目录:元素复制 copy 反向复制 copy_backward 元素交换 swap迭代器交换 iter_swap 区间元... 阅读全文
-
STL学习笔记--非变易算法
摘要:STL学习笔记--非变易算法非变易算法 C++ STL 的非变易算法(Non-mutating algorithm)是一组不破坏操作数据的模板函数,用来对序列数据进行逐个处理、元素查找、子序列搜索、统计和匹配。作为算法函数参数的迭代器,一般为 Input Iterator 输入迭代器,具有 "++" 迭代和 "*" 访问操作。通过迭代器的元素遍历,可对迭代器区间所界定的元素进行操作。因此,非变易算法具有极为广泛的适用性,基本上可应用于各种容器。目录:逐个容器元素 for_each查找容器元素 find条件查找容器元素 find_if邻近查找容器元素 ad 阅读全文
-
STL学习小记--与C++模板相关的几个特性
摘要:STL学习小记--与C++模板相关的几个特性先谈谈模板在我脑子里的典型吧template<class T>const T& GetMax(const T& t1, const T& t2){ return t1>t2?t1:t2;}如上面的代码,这是一个模板函数(template function)。要使用这个函数,传入的参数必须满足>运算符的条件。在C#中有where关键字,很可惜C++的模板没有这种限制。而据说BS本人也一再声明C++的模板不需要这种限制,作为一个初学者,其中缘由就不得而知了。template并非一次编译便生成适合所有类型的代 阅读全文