陈硕的 Blog

吾尝终日而思矣,不如须臾之所学也。吾尝跂而望矣,不如登高之博见也。……君子生非异也,善假于物也。

随笔分类 - C++ 工程实践

C++面试中string类的一种正确简明的写法
摘要: 本文首发于酷壳网 http://coolshell.cn/articles/10478.html先说说程序员(应届生)面试的一般过程,一轮面试(面对一到两个面试官)一般是四、五十分钟,面试官会问两三个编程问题(通常是两大一小),因此留给每个编程题的时间只有 20 分钟。这 20 分钟不光是写代码,还要跟面试官讨论你的答案并解答提问,比如面试官拿过你的答案纸,问某一行代码如果修改会有什么后果。因此真正留给在纸上或白板上写代码的时间也就 10 分钟上下。本文给出了一个能用 10 分钟时间在纸上写出来且不会有错的 String class,强调正确性及易实现(白板上写也不会错),不强调效率与功能完备阅读全文

posted @ 2013-10-11 10:57 陈硕 阅读(3400) | 评论 (1) 编辑

近期微博吐槽言论存档,涉及“性能优化”、C++陋习等
摘要: 写C++程序的几个陋习:class 名以大写 C 开头,例如 CDate;成员变量以 m_ 开头;变量采用匈牙利命名法;不知道何时禁用 copy-ctor/assign operator。前三个可能是从MFC那里传下来的,当时C++、class、OO是新玩意儿,要与 C struct 区分,现在还这么做就土了。C++的成员变量可用特殊命名格式,加下划线后缀即可(加下划线前缀是错的)。但在 Java 里不必模仿 C++ 的这种成员变量命名方式,IDE 可以让成员变量以不同的颜色显示,与局部变量区分,根本无需特殊命名。写程序就怕把以前的编程经验不加区分地应用到新语言中,写成四不像,不地道。知道禁用阅读全文

posted @ 2013-08-12 13:54 陈硕 阅读(3491) | 评论 (4) 编辑

《Linux多线程服务端编程:使用muduo C++网络库》上市半年重印两次,总印数达到了9000册
摘要: 《Linux多线程服务端编程:使用muduo C++网络库》这本书自今年一月上市以来,半年之内已经重印两次(加上首印,一共是三次印刷),总印数达到了9000册,这在技术书里已经算是相当不错的成绩。以下谈一谈这本书的写作背景与内容取舍的原因。阅读全文

posted @ 2013-07-17 11:18 陈硕 阅读(4403) | 评论 (12) 编辑

为什么多线程读写 shared_ptr 要加锁?
摘要: 陈硕(giantchen_AT_gmail_DOT_com)2012-01-28我在《Linux 多线程服务端编程:使用 muduo C++ 网络库》第 1.9 节“再论 shared_ptr 的线程安全”中写道:(shared_ptr)的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafety), shared_ptr 的线程安全级别和内建类型、标准库容器、std::s阅读全文

posted @ 2013-01-28 05:17 陈硕 阅读(5138) | 评论 (6) 编辑

关于 std::set/std::map 的几个为什么
摘要: 尽管 C++ 标准没有强求 std::map 底层的数据结构,但是根据其规定的时间复杂度,现在所有的 STL 实现都采用平衡二叉树来实现 std::map,而且用的都是红黑树。本文对 STL 中红黑树(rb_tree)的实现问了几个稍微深入一点的问题,并给出了我的理解。阅读全文

posted @ 2013-01-20 13:22 陈硕 阅读(4912) | 评论 (2) 编辑

《Linux 多线程服务端编程:使用 muduo C++ 网络库》网上书店预订
摘要: 内容简介本书主要讲述采用现代 C++ 在 x86-64 Linux 上编写多线程 TCP 网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即 one loop per thread。这是在 Linux 下以 native 语言编写用户态高性能网络程序最成熟的模式,掌握之后可顺利地开发各类常见的服务端网络应用程序。本书以 muduo 网络库为例,讲解这种编程模型的使用方法及注意事项。本书的宗旨是贵精不贵多。掌握两种基本的同步原语就可以满足各种多线程同步的功能需求,还能写出更易用的同步设施。掌握一种进程间通信方式和一种多线程网络编程模型就足以应对日常开发任务,编写运行于阅读全文

posted @ 2013-01-11 12:35 陈硕 阅读(4392) | 评论 (8) 编辑

新书预告:《Linux 多线程服务端编程——使用 muduo C++ 网络库》
摘要: 看完了 W. Richard Stevens 的传世经典《UNIX 网络编程》, 能照着例子用 Sockets API 编写 echo 服务, 却仍然对稍微复杂一点的网络编程任务感到无从下手? 书中示例代码把业务逻辑和 Sockets 调用混在一起,似乎不利于将来扩展?程序在本机测试正常,放到网络运行上就经常出现数据收不全的情况?TCP 协议真的有所谓的“粘包问题”吗?该如何设计打包拆包的协议?又该如何编码实现才不会掉到陷阱里?带外数据(OOB)、信号驱动IO这些高级特性到底有没有用?网络协议格式该怎么设计?发送 C struct 会有对齐方面的问题吗?对方不用 C/C++ 怎么通信? 将来服阅读全文

posted @ 2012-09-21 07:17 陈硕 阅读(3702) | 评论 (8) 编辑

C++ 工程实践(12):C++ 编译链接模型精要
摘要: 《C++ 工程实践》新增第15节“C++ 编译链接模型精要”PDF 下载:https://github.com/downloads/chenshuo/documents/CppPractice.pdf阅读全文

posted @ 2012-04-20 08:21 陈硕 阅读(1731) | 评论 (0) 编辑

C++ 工程实践(11):用 STL algorithm 秒杀几道算法面试题
摘要: 《C++ 工程实践》新增第14节“用 STL algorithm 秒杀几道算法面试题”PDF 下载:https://github.com/downloads/chenshuo/documents/CppPractice.pdf阅读全文

posted @ 2012-04-01 10:07 陈硕 阅读(2548) | 评论 (0) 编辑

C++ 工程实践(10):再探std::string
摘要: 本文总结了std::string的三种常见实现方式。全文见https://github.com/downloads/chenshuo/documents/CppPractice.pdf第13节。阅读全文

posted @ 2012-03-17 16:36 陈硕 阅读(4836) | 评论 (0) 编辑

C++ 工程实践(9):数据抽象
摘要: 陈硕 (giantchen_AT_gmail)http://blog.csdn.net/Solstice http://weibo.com/giantchen陈硕关于 C++ 工程实践的系列文章: http://blog.csdn.net/Solstice/category/802325.aspx排版正常的版本: http://www.cnblogs.com/Solstice/category/287661.html陈硕博客文章合集下载: http://blog.csdn.net/Solstice/archive/2011/02/24/6206154.aspx本作品采用“Creative Co阅读全文

posted @ 2011-08-22 00:20 陈硕 阅读(4294) | 评论 (6) 编辑

C++ 工程实践(8):值语义
摘要: 本文是前一篇《C++ 工程实践(7):iostream 的用途与局限》的后续,在这篇文章的“iostream 与标准库其他组件的交互”一节,我简单地提到iostream的对象和C++标准库中的其他对象(主要是容器和string)具有不同的语义,主要体现在iostream不能拷贝或赋值。今天全面谈一谈我对这个问题的理解。阅读全文

posted @ 2011-08-16 21:14 陈硕 阅读(4958) | 评论 (3) 编辑

C++ 工程实践(7):iostream 的用途与局限
摘要: C++ iostream 的主要作用是让初学者有一个方便的命令行输入输出试验环境,在真实的项目中很少用到 iostream,因此不必把精力花在深究 iostream 的格式化与 manipulator。iostream 的设计初衷是提供一个可扩展的类型安全的 IO 机制,其整个设计复杂不堪,iostream 在实际项目中的用处非常有限,为此投入过多学习精力实在不值。阅读全文

posted @ 2011-07-17 15:08 陈硕 阅读(16175) | 评论 (9) 编辑

C++ 工程实践(6):单元测试如何 mock 系统调用
摘要: 本文讨论了在编写单元测试时 mock 系统调用(以及其他第三方库)的几种做法。阅读全文

posted @ 2011-05-16 00:20 陈硕 阅读(2918) | 评论 (0) 编辑

C++ 工程实践(5):避免使用虚函数作为库的接口
摘要: 作为 C++ 动态库的作者,应当避免使用虚函数作为库的接口。这么做会给保持二进制兼容性带来很大麻烦,不得不增加很多不必要的 interfaces,最终重蹈 COM 的覆辙。 本文主要讨论 Linux x86 平台,会继续举 Windows/COM 作为反面教材。阅读全文

posted @ 2011-03-13 09:07 陈硕 阅读(3246) | 评论 (12) 编辑

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)。至于编译器与操作系统的 ABI 留给下一篇谈 C++ 标准与实践的文章。什么是二进制兼容性在解释这个阅读全文

posted @ 2011-03-09 10:55 陈硕 阅读(4344) | 评论 (10) 编辑

C++ 工程实践(3):采用有利于版本管理的代码格式
摘要: 所谓“有利于版本管理”的代码格式,就是指在代码中合理使用换行符,对 diff 工具友好,让 diff 的结果清晰明了地表达代码的改动。阅读全文

posted @ 2011-03-05 15:17 陈硕 阅读(2571) | 评论 (11) 编辑

C++ 工程实践(2):不要重载全局 ::operator new()
摘要: 对于现实生活中的 C++ 项目,重载 ::operator new() 几乎没有用武之地,因为很难处理好与程序所用的 C++ library 的关系。如果确实需要,我们可以从 malloc 层面入手,彻底而全面地替换内存分配器。阅读全文

posted @ 2011-02-22 01:21 陈硕 阅读(2898) | 评论 (1) 编辑

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 等处就用到了匿名 namespace。我最近在工作中遇到并重新思考了这一问题,发现匿名 na阅读全文

posted @ 2011-02-15 22:55 陈硕 阅读(1707) | 评论 (0) 编辑

导航

统计

公告