写C++程序的几个陋习:class 名以大写 C 开头,例如 CDate;成员变量以 m_ 开头;变量采用匈牙利命名法;不知道何时禁用 copy-ctor/assign operator。前三个可能是从MFC那里传下来的,当时C++、class、OO是新玩意儿,要与 C struct 区分,现在还这么做就土了。C++的成员变量可用特殊命名格式,加下划线后缀即可(加下划线前缀是错的)。但在 Java 里不必模仿 C++ 的这种成员变量命名方式,IDE 可以让成员变量以不同的颜色显示,与局部变量区分,根本无需特殊命名。写程序就怕把以前的编程经验不加区分地应用到新语言中,写成四不像,不地道。
知道禁用 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 头文件好了。
性能优化?
有些人常常把“性能”挂在嘴边,而且其以“提高性能”为理由的“优化措施”往往不到点子上,只增加了复杂性和维护难度,降低了代码质量。这属于决策点找偏了。我发现初学者往往过分关注微观(语句级)性能,比方说关心 while(true) 和 for(;;) 哪个更快,++i 与 i=i+1 哪个更快,i/=16 和 i >>= 4 哪个快等等,而忽视了现代编译器的优化能力。
有的人谈性能优化,一是拿不出具体的合理的性能目标,只想越快越好,二是不能实际准确测量验证性能数据,凭感觉和过时经验行事。在编码的时候,遇到两种做法都可行,决策办法是凭感觉猜选“性能会更好”的一种,而忽视了其他更重要的因素。可读性和性能的典型关系如下图,有多少场合是值得为了性能而牺牲代码的可读性和可维护性呢?我希望自己的代码位于第 3 区,而一些人以为自己的代码是在第 4 区,其实是在第 1 区。
能在第 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网络编程。
分享到:
相关推荐
无视用户体验?白鸦微博集中吐槽阿里系应用.docx
一个留言类型的网站,适合新手。吐槽网站。特别适合新手进行学习。也可以直接使用。
.net制作吐槽网,含有登录 查看 发布 评论 点赞 等
基于PHP的消息果留言板(吐槽版) PHP源码.zip
使用纯C++实现的类似于qt的信号槽,这个代码用于学习再适合不过了
无力吐槽是什么意思.doc
总体设计主要包括系统功能设计、系统总体结构设计、系统数据结构设计和系统安全设计等;详细设计主要包括系统数据库访问的实现,主要功能模块的具体实现,模块实现关键代码等。最后对系统进行功能测试,并对测试结果...
工作中那些不得不吐槽的Chinglish
物化实验报告恒温槽的装配和性能测试.doc
作者太闲了,就做了个程序,看看就行,别吐槽了
新浪微博客户端的源码下载,里面用到了一个videoview,所以要将a5.mp4文件(http://pan.baidu.com/s/1nt6tlMD)复制到你手机SD卡的根目录,不下载也可以只是会黑屏2-3秒,此demo是自己搭的服务器(通过tomcat),请...
web登录页面
C++进程通讯
一个快速高效的端口扫描工具,制定IP段扫描端口,还可以对部分路由器读取路由器相关用户信息。支持路由器或服务器型号:XM-3300N- ASUS- D-Link- LevelOne- Netis- Pozitron- TP-LINK支持端口:8080,80,8888,8081...
实测有效提升laya spine 4.0版本16倍有余 优化文档. 链接中的qq并非本人 https://blog.csdn.net/qq_39162566/article/details/124948997
圆周率计算 希望能帮到大家 #include using namespace std; long long a=1000000,b,c=7000000,d,e,f[7000100],g,n=-1,len; char str[100005]="141"; int main() { scanf("%d",&len); for(;...}
翻译上面都吐槽了,我说点好处吧这本书能让你有个学习路线,循序渐进而且知识点覆盖的还比较全面如果遇到不懂的,可以直接看原著或者自己网上搜相关知识点有些佶屈聱牙的地方尤其对自学者来说很头疼一定要学会自己搜...
android实现吐槽弹幕.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
1.采用Material Design设计风格,轻巧灵便,简易唯美。 2.支持emoji表情,支持本地照片的发布。 3.支持查看gif图片,瀑布流显示图片相册。 4.支持大图查看,图片下载。 5.支持定时发布等等。...欢迎下载使用,欢迎吐槽