c++
文章平均质量分 77
陈硕
@bnu_chenshuo
展开
-
近期微博吐槽言论存档,涉及“性能优化”、C++陋习等
写C++程序的几个陋习:class 名以大写 C 开头,例如 CDate;成员变量以 m_ 开头;变量采用匈牙利命名法;不知道何时禁用 copy-ctor/assign operator。有些人常常把“性能”挂在嘴边,而且其以“提高性能”为理由的“优化措施”往往不到点子上,只增加了复杂性和维护难度,降低了代码质量。这属于决策点找偏了。原创 2013-08-12 13:57:21 · 42981 阅读 · 17 评论 -
C++ 工程实践(2):不要重载全局 ::operator new()
对于现实生活中的 C++ 项目,重载 ::operator new() 几乎没有用武之地,因为很难处理好与程序所用的 C++ library 的关系。如果确实需要,我们可以从 malloc 层面入手,彻底而全面地替换内存分配器。原创 2011-02-22 01:23:00 · 20325 阅读 · 28 评论 -
C++ 工程实践(5):避免使用虚函数作为库的接口
摘要:作为 C++ 动态库的作者,应当避免使用虚函数作为库的接口。这么做会给保持二进制兼容性带来很大麻烦,不得不增加很多不必要的 interfaces,最终重蹈 COM 的覆辙。 本文主要讨论 Linux x86 平台,会继续举 Windows/COM 作为反面教材。 本文是上一篇《C++ 工程实践(4):二进制兼容性》的延续,在写这篇文章的时候,我原本以外大家都对“以虚函数作为接口”的害处达成共识,我就写得比较简略,看来情况不是这样,我还得展开谈一谈。原创 2011-03-12 22:01:00 · 25663 阅读 · 110 评论 -
C++ 工程实践(4):二进制兼容性
陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 本文主要讨论 Linux x86/x86-64 平台,偶尔会举 Windows 作为反面教材。 C/C++ 的二进制兼容性 (binary compatibility) 有多重含义,本文主要在“头文件和库文件分别升级,可执行文件是否受影响”这个意义下讨论,我称之为 library (主要是 shared library,即动态链接库)的 ABI (application binary interface)。原创 2011-03-09 10:46:00 · 29604 阅读 · 63 评论 -
C++ 工程实践(3):采用有利于版本管理的代码格式
版本管理(version controlling)是每个程序员的基本技能,C++ 程序员也不例外。版本管理的基本功能之一是追踪代码变化,让你能清楚地知道代码是如何一步步变成现在的这个样子,以及每次 check-in 都具体改动了哪些内部。所谓“有利于版本管理”的代码格式,就是指在代码中合理使用换行符,对 diff 工具友好,让 diff 的结果清晰明了地表达代码的改动。原创 2011-03-05 15:16:00 · 15426 阅读 · 24 评论 -
C++ 工程实践(1):慎用匿名 namespace
匿名 namespace (anonymous namespace 或称 unnamed namespace) 是 C++ 的一项非常有用的功能,其主要目的是让该 namespace 中的成员(变量或函数)具有独一无二的全局名称,避免名字碰撞 (name collisions)。一般在编写 .cpp 文件时,如果需要写一些小的 helper 函数,我们常常会放到匿名 namespace 里。muduo 0.1.7 中的 muduo/base/Date.cc 和 muduo/base/Thread.cc 等处原创 2011-02-15 22:56:00 · 36815 阅读 · 58 评论 -
C++ 多线程系统编程精要
这是一套紧凑的 PPT,基本上每一张幻灯片都可以单独写一篇博客,但是我没有那么多时间一一展开论述,只能把结论和主要论据列了出来。原创 2011-02-12 18:42:00 · 32140 阅读 · 29 评论 -
为什么 muduo 的 shutdown() 没有直接关闭 TCP 连接?
今天收到一位网友来信:在 simple 中的 daytime 示例中,服务端主动关闭时调用的是如下函数序列,这不是只是关闭了连接上的写操作吗,怎么是关闭了整个连接?陈硕答复如下:Muduo TcpConnection 没有提供 close,而只提供 shutdown ,这么做是为了收发数据的完整性。原创 2011-02-25 21:30:00 · 12957 阅读 · 8 评论 -
Muduo 网络编程示例之三:定时器
本文介绍在非阻塞网络编程中定时器的用法与注意事项。原创 2011-02-06 23:05:00 · 17263 阅读 · 21 评论 -
Muduo 网络编程示例之二:Boost.Asio 的聊天服务器
这是《Muduo 网络编程示例》系列的第二篇文章。 本文讲介绍一个与 Boost.Asio 的示例代码中的聊天服务器功能类似的网络服务程序,包括客户端与服务端的 muduo 实现。这个例子的主要目的是介绍如何处理分包,并初步涉及 Muduo 的多线程功能。原创 2011-02-04 08:58:00 · 22440 阅读 · 11 评论 -
Muduo 网络编程示例之一:五个简单 TCP 协议
这是《Muduo 网络编程示例》系列的第一篇文章。本文将介绍五个简单 TCP 网络服务协议的 muduo 实现,包括 echo (RFC 862)、discard (RFC 863)、chargen (RFC 864)、daytime (RFC 867)、time (RFC 868),以及 time 协议的客户端。以上五个协议使用不同的端口,可以放到同一个进程中实现,且不必使用多线程。原创 2011-02-02 12:59:00 · 20218 阅读 · 12 评论 -
Muduo 网络编程示例之零:前言
我将会写一系列文章,介绍用 muduo 网络库完成常见的 TCP 网络编程任务。这些例子都比较简单,逻辑不复杂,代码也很短,适合摘取关键部分放到博客上。其中一些有一定的代表性与针对性,比如“如何传输完整的文件”估计是网络编程的初学者经常遇到的问题。原创 2011-02-02 00:58:00 · 40418 阅读 · 34 评论 -
Muduo 网络编程示例之四:Twisted Finger
Python Twisted 是一款非常好的网络库,它也采用 Reactor 作为网络编程的基本模型,所以从使用上与 muduo 颇有相似之处。(当然,muduo 没有 deferreds)Finger 是 twisted 文档的一个经典例子,本文展示如何用 muduo 来实现最简单的 finger 服务端。限于篇幅,只实现 finger01~07。代码位于 examples/twisted/finger 。原创 2011-02-23 21:34:00 · 7513 阅读 · 3 评论 -
一种自动反射消息类型的 Google Protobuf 网络传输方案
这篇文章要解决的问题是:在接收到 protobuf 数据之后,如何自动创建具体的 Protobuf Message 对象,再做的反序列化。“自动”的意思是:当程序中新增一个 protobuf Message 类型时,这部分代码不需要修改,不需要自己去注册消息类型。其实,Google Protobuf 本身具有很强的反射(reflection)功能,可以根据 type name 创建具体类型的 Message 对象,我们直接利用即可。原创 2011-04-03 15:57:00 · 88586 阅读 · 117 评论 -
C++ 工程实践(7):iostream 的用途与局限
C++ 工程实践(7):iostream 的用途与局限陈硕 (giantchen_AT_gmail)http://blog.csdn.net/Solstice http://weibo.com/giantchen陈硕关于 C++ 工程实践的系列文章: ht原创 2011-07-17 15:08:54 · 34076 阅读 · 33 评论 -
为什么多线程读写 shared_ptr 要加锁?
为什么多线程读写 shared_ptr 要加锁?陈硕(giantchen_AT_gmail_DOT_com)2012-01-28最新版下载:http://chenshuo.googlecode.com/files/CppEngineering.pdf我在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_原创 2013-01-28 05:13:55 · 97885 阅读 · 55 评论 -
关于 std::set/std::map 的几个为什么
陈硕 (chenshuo.com)2013-01-20std::set/std::map (以下用 std::map 代表) 是常用的关联式容器,也是 ADT(抽象数据类型)。也就是说,其接口(不是 OO 意义下的 interface)不仅规定了操作的功能,还规定了操作的复杂度(代价/cost)。例如 set::insert(iterator first, iterator last) 在通常情况原创 2013-01-20 13:22:53 · 59809 阅读 · 9 评论 -
《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店订购
《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店订购内容简介本书主要讲述采用现代 C++ 在 x86-64 Linux 上编写多线程 TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即 one loop per thread。这是在 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的原创 2013-01-11 12:43:50 · 64119 阅读 · 170 评论 -
新书预告:《Linux 多线程服务端编程:使用 muduo C++ 网络库》
看完了 W. Richard Stevens 的传世经典《UNIX 网络编程》, 能照着例子用 Sockets API 编写 echo 服务, 却仍然对稍微复杂一点的网络编程任务感到无从下手? 书中示例代码把业务逻辑和 Sockets 调用混在一起,似乎不利于将来扩展?网络编程中的遇到一些具体问题该怎么办?例如程序在本机测试正常,放到网络运行上就经常出现数据收不全的情况?TCP 协议真的有所谓的“原创 2012-09-21 07:11:15 · 48084 阅读 · 16 评论 -
发布适合服务端C++程序的高效日志库
PPT 见http://www.slideshare.net/chenshuo/efficient-logging-in-multithreaded-c-server/2012年6月30日在深圳的简短演讲:http://v.youku.com/v_show/id_XNDIyMjUwMDYw.htmlhttp://www.youtube.com/watch?v=KM_eQ6uRYdU代码位于 mud原创 2012-06-06 21:20:25 · 35075 阅读 · 10 评论 -
从《C++ Primer 第四版》入手学习 C++
《C++ Primer 第4版 评注版》即将出版,这是序言。PDF 版见:https://github.com/downloads/chenshuo/documents/LearnCpp.pdf从《C++ Primer 第四版》入手学习 C++为什么要学习C++?2009 年本书作者 Stan Lippman 先生来华参加上海祝成科技举办的C++技术大会,他表示人们现在还用C++的惟一理由是其性能原创 2012-07-06 08:54:20 · 80428 阅读 · 14 评论 -
C++ 工程实践(12):C++ 编译链接模型精要
《C++ 工程实践》新增第15节“C++ 编译链接模型精要” PDF 下载: https://github.com/downloads/chenshuo/documents/CppPractice.pdf原创 2012-04-20 08:18:46 · 20994 阅读 · 0 评论 -
C++ 工程实践(10):再探std::string
本文总结了std::string的三种常见实现方式。全文见 https://github.com/downloads/chenshuo/documents/CppPractice.pdf 第13节。原创 2012-03-17 16:29:55 · 17396 阅读 · 0 评论 -
C++ 工程实践(11):用 STL algorithm 秒杀几道算法面试题
《C++ 工程实践》新增第14节“用 STL algorithm 秒杀几道算法面试题” PDF 下载: https://github.com/downloads/chenshuo/documents/CppPractice.pdf原创 2012-04-01 10:01:26 · 23446 阅读 · 4 评论 -
C++ 工程实践(9):数据抽象
陈硕 (giantchen_AT_gmail)http://blog.csdn.net/Solstice http://weibo.com/giantchen陈硕关于 C++ 工程实践的系列文章: http://blog.csdn.net/Solstice/category/8原创 2011-08-22 00:20:40 · 19184 阅读 · 4 评论 -
C++ 工程实践(8):值语义
陈硕 (giantchen_AT_gmail)http://blog.csdn.net/Solstice http://weibo.com/giantchen陈硕关于 C++ 工程实践的系列文章: http://blog.csdn.net/Solstice/category/8原创 2011-08-16 21:16:23 · 16677 阅读 · 3 评论 -
muduo 与 libevent2 吞吐量对比
libevent 是一款非常好用的 C 语言网络库,它也采用 Reactor 模型,正好可以与 muduo 做一对比。 本文用 ping pong 测试来对比 muduo 和 libevent2 的吞吐量,测试结果表明 muduo 吞吐量平均比 libevent2 高 18% 以上,个别情况达到 70%。原创 2010-09-05 18:43:00 · 34702 阅读 · 18 评论 -
击鼓传花:对比 muduo 与 libevent2 的事件处理效率
前面我们比较了 muduo 和 libevent2 的吞吐量,得到的结论是 muduo 比 libevent2 快 18%。有人会说,libevent2 并不是为高吞吐的应用场景而设计的,这样的比较不公平,胜之不武。为了公平起见,这回我们用 libevent2 自带的性能测试程序(击鼓传花)来对比 muduo 和 libevent2 在高并发情况下的 IO 事件处理效率。 结论:在 IO 事件处理效率方面,muduo 与 libevent2 总体比较接近,各擅胜场。在并发量特别大的情况下(大于 10k),m原创 2010-09-08 01:00:00 · 21122 阅读 · 18 评论 -
zlib 在 Visual Studio 2005 下编译失败的解决办法
最近需要读写 png 文件,按照以前的办法试验,却发现无法编译zlib 1.2.3。出错信息为:inffas32.asm(594) : error A2070: invalid instruction operands inffas32.asm(596) : error A2070: invalid instruction operands inffas32.asm(610) : error原创 2006-02-06 15:07:00 · 7629 阅读 · 1 评论 -
JPEG 学习笔记
JPEG 学习笔记原创 2005-12-02 19:54:00 · 5983 阅读 · 1 评论 -
Verilog与C++的类比
1. Verilog中的module对应C++中的class。它们都可以实例化。例如可以写一个FullAdder module,表示全加器这种器件。 module FullAdder(a, b, cin, sum, cout); input a, b, cin; output sum, cout; assign {cout, sum} = a + b + cin;endmodule原创 2005-11-24 12:09:00 · 8518 阅读 · 3 评论 -
分析函数调用关系图(call graph)的几种方法
绘制函数调用关系图对理解大型程序大有帮助。我想大家都有过一边读源码(并在头脑中维护一个调用栈),一边在纸上画函数调用关系,然后整理成图的经历。如果运气好一点,借助调试器的单步跟踪功能和call stack窗口,能节约一些脑力。不过如果要分析的是脚本语言的代码,那多半只好老老实实用第一种方法了。如果在读代码之前,手边就有一份调用图,岂不妙哉?下面举出我知道的几种免费的分析C/C++函数调用关系的工具原创 2005-09-24 19:28:00 · 88742 阅读 · 7 评论 -
利用Bresenham算法控制多部步进电机匀速转动
计算机图形学中绘制直线的Bresenham算法原本是用在绘图仪上控制X轴方向和Y轴方向的两部电机的,最近遇到一个十分类似的步进电机控制问题,用Bresenham算法恰好能解决。问题描述:有左右两个相同的步进电机,用8051单片机控制L297 + L298芯片驱动,需要它们同时转动(同时启动,同时停止),但转速不同。例如左侧电机正转180步,同时右侧电机反转97步。这就好比从原点出发画一条到点(18原创 2005-09-24 21:48:00 · 8826 阅读 · 1 评论 -
用CodeViz绘制函数调用关系图(call graph)
CodeViz是《Understanding The Linux Virtual Memory Manager》(at Amazon,下载地址在页尾)的作者 Mel Gorman 写的一款分析C/C++源代码中函数调用关系的open source工具(类似的open source软件有 egypt、ncc)。其基本原理是给 GCC 打个补丁,让它在编译时每个源文件时 dump 出其中函数的 cal原创 2005-09-22 01:15:00 · 37180 阅读 · 10 评论 -
正态分布的随机数发生器 in C#
主要参考《Numerical Recipes in C++ 2/e》p.292~p.294 和《Simulation Modeling and Analysis 3/e》p.465~p.466。Box 和 Muller 在 1958 年给出了由均匀分布的随机变量生成正态分布的随机变量的算法。设 U1, U2 是区间 (0, 1) 上均匀分布的随机变量,且相互独立。令X1 = sqrt(-2*l原创 2004-11-12 12:23:00 · 9379 阅读 · 4 评论 -
zlib 与 libpng 的配置与使用 part 3 libpng的安装与生成PNG图片
libpng 的安装接下来,安装 libpng 的过程要稍微轻松些。先下载最新的 libpng 程序库源文件。网址是http://sourceforge.net/projects/libpng/或http://www.libpng.org/pub/png/。不妨设下载的文件是 libpng-1.2.5.tar.gz,将这个文件释放到D:/libpng/。修改D:/libpng/libpng原创 2003-04-04 10:54:00 · 25905 阅读 · 1 评论 -
zlib 与 libpng 的配置与使用 part 2 zlib的安装
zlib 的安装libpng 是一套免费的、公开源代码的程序库,支持对 PNG 图形文件的创建、读写等操作。libpng 使用 zlib 程序库作为压缩引擎,zlib 也是著名的 gzip (GNU zip) 所采用的压缩引擎。我们首先安装zlib,从其官方网站下载最新的源程序,不妨假设文件名是zlib-1.1.4.tar.gz。网址:http://www.gzip.org/zlib/。原创 2003-04-04 09:10:00 · 9651 阅读 · 1 评论 -
zlib 与 libpng 的配置与使用 part1
zlib 与 libpng 的配置与使用Solstice 2003/04/3说明:本文节选自我主页上的一篇文章,原文介绍了1) Wave 文件的格式、2)读取 Wave 文件内容,并显示文件的基本信息、3)压缩库 zlib 的安装与简单应用、4)PNG 库 libpng 的安装、5)使用 libpng 生成 PNG 文件、6)绘制 Wave 文件的波形,这里只截取3、4、5这三部分内容。原创 2003-04-04 09:10:00 · 6119 阅读 · 0 评论 -
用next_permutation()生成r-组合数,兼发现VC7的一个bug
C++ standard library提供了两个生成排列的algorithms:next_permutation()与prev_permutation(),却没有提供生成组合数的标准函数。 由于排列与组合之间有着密切的联系,我们很容易就可以从“排列”获得“组合”。从n个元素中任取r个元素的组合,有n! / (r! * (n-r)!)个。这些组合可用多重集{r·1, (n-r)·原创 2002-10-21 09:10:00 · 7428 阅读 · 2 评论 -
小试一把 64 位 Windows 编程
环境:Windows 2003 Server x64 Edition, Visual Studio 200564-bit 的编程模型有很多种(LP64、LLP64、ILP64),Windows x64 版采用的是 LLP64 模型:int、long 都是 32-bit,void* 是 64-bit,新增数据类型 long long,也是 64-bit。我写了个 console原创 2006-02-22 15:03:00 · 6524 阅读 · 4 评论