近期微博吐槽言论存档,涉及“性能优化”、C++陋习等

写C++程序的几个陋习:class 名以大写 C 开头,例如 CDate;成员变量以 m_ 开头;变量采用匈牙利命名法;不知道什么时候禁用 copy-ctor/assign operator。前三个多是从MFC那里传下来的,当时C++、class、OO是新玩意儿,要与 C struct 区分,如今还这么作就土了。C++的成员变量可用特殊命名格式,加下划线后缀便可(加下划线前缀是错的)。但在 Java 里没必要模仿 C++ 的这种成员变量命名方式,IDE 可让成员变量以不一样的颜色显示,与局部变量区分,根本无需特殊命名。写程序就怕把之前的编程经验不加区分地应用到新语言中,写成四不像,不地道。react

知道禁用 copy-ctor/assign operator 是 C++ 程序员的试金石。在看到一个开源项目时,我通常会先查看其 RAII handle class 是否禁用了 copy-ctor/assign operator(例如 Thread、Mutex、CondVar、Connection),若是没有,对其第一印象就不好了。程序员

关于 class 命名风格,Google、LLVM、Mozilla、muduo 都采用 Pascal 风格(LikeThis),例如 EventLoop、SudokuSolver 等等。正巧它们也都是用 2 格缩进的,能够用 clang-format 自动格式化代码。编程

顺便说说我不认同的两个 C++ 教条:1. 用nullptr替换NULL,2. 用cstdio头文件替换stdio.h。性能优化

由于例如 gettimeofday(&tv, NULL) 这种系统函数传个 nullptr 进去实在是违和,如今用 NULL 也能达到 nullptr 的好处,大不了在某个头文件里define一下就行。这条未来或许会变。网络

另外 ctime 头文件没定义 std::gmtime_r,而 time.h 定义了 ::gmtime_r。我可不想去背哪些函数是 C 语言的哪些是 Posix 的,哪些头文件是 C 语言的哪些是 Posix 的(在Linux下,两者基本不分家)。为了用几个系统函数(例如 fcntl() ),我该 include cfcntl 仍是 fcntl.h?用线程是 cpthread 仍是 pthread.h?我老是记不住 memset() 的参数顺序,所以通常用 bzero() 代替,可是 manpage 说 bzero() 声明于 strings.h,那我要不要考虑试试 cstrings 呢?何须给本身找麻烦,C++ 标准库以外的内容干脆统一用 .h 头文件好了。函数

性能优化?oop

有些人经常把“性能”挂在嘴边,并且其以“提升性能”为理由的“优化措施”每每不到点子上,只增长了复杂性和维护难度,下降了代码质量。这属于决策点找偏了。我发现初学者每每过度关注微观(语句级)性能,比方说关心 while(true) 和 for(;;) 哪一个更快,++i 与 i=i+1 哪一个更快,i/=16 和 i >>= 4 哪一个快等等,而忽视了现代编译器的优化能力。性能

有的人谈性能优化,一是拿不出具体的合理的性能目标,只想越快越好,二是不能实际准确测量验证性能数据,凭感受和过期经验行事。在编码的时候,遇到两种作法均可行,决策办法是凭感受猜选“性能会更好”的一种,而忽视了其余更重要的因素。可读性和性能的典型关系以下图,有多少场合是值得为了性能而牺牲代码的可读性和可维护性呢?我但愿本身的代码位于第 3 区,而一些人觉得本身的代码是在第 4 区,实际上是在第 1 区。测试

read-perf

能在第 4 区写代码的人属于百里挑一,有时候你费劲优化了半天,结果新CPU加了几条指令,直接在硬件层面把问题解决了。如今一些人动不动就要挽起袖子本身写内存池,号称能提升性能,真当 Ulrich Drepper 是水货?(书第 12.2.8 节“有必要自行定制内存分配器吗”)你打算如何测试内存分配器(malloc)的性能?有哪些指标?有哪些影响因素须要控制或模拟(好比线程数)?你的测试结果是否反映实际场景?优化

杂项

有人问为何我说“poco不是服务端C++网络库”( http://www.oschina.net/question/12_120943 ),虽然它也提供了reactor?由于它的reactor用的是 Socket::select(),虽而后者包装了epoll,但看其实现就知道,它每次调用都会建立并销毁 epoll fd,而后重建整个watch list,没有哪一个服务端网络库会这么作。

嗯,世界上有两种网络编程:网络编程和Windows网络编程。

相关文章
相关标签/搜索