刀不磨会生锈,久了不编程,也会忘记很多关键的东西,其中之一就是会把日常编程中应当注意的问题忘记,慢慢地写的代码就很烂了,不忍卒读.....

编程是一门细致活儿,有很多陷阱,其中之一是我们容易编写劣化的代码,相当多的人都想不通自己写的代码怎么写都没有人家的执行起来有效率,所以在这里我就写一些自己掌握的这方面的知识,一来是防止自己忘却,二来是与大家分享,特别是初学编程者。

相当一部分人会认为我写出来的内容应该算是代码优化层面,我是不这样认为的。我认为编程中优化不可过早,但避免劣化代码却要时刻进行。我这里谈的内容有些是老生常谈,那我就深入挖掘,力求旧瓶有新酒;有些是鲜为人知,那我就详言细述,力求深入浅出。

关于避免代码劣化这个话题,将不限于C和C++两种语言,还包括python,lua等大家熟悉的脚本语言,甚至是boost,OpenMP等学用的库,也许还会见到SQL语句的优化等,希望大家多多捧场~

本系列文章欢迎转载、打印、分发等,但不可用于商业用途,任何时候必须保留全文完整,并声明转载自恋花蝶的博客(http://blog.csdn.net/lanphaday),谢谢。

避免劣化代码(一)
No Inferior Code(1)
条款1尽量使用拷贝构造函数初始化实例变量,而非使用赋值操作符进行初始化。
例:
#include <ctime>
#include <iostream>
#include <string>
void test_inferior_code(int cnt, const char* str)
{
       for(int i = 0; i < cnt; ++i)
       {
              std::string s;
              s = str;
              s[0] = 'H';
       }
}
void test_excellent_code(int cnt, const char* str)
{
       for(int i = 0; i < cnt; ++i)
       {
              std::string s(str);
              s[0] = 'H';
       }
}
int main()
{
       static const int cnt = 1000000;
       char str[] = "hello";
       clock_t bgn = clock();
       test_inferior_code(cnt, str);
       clock_t end = clock();
       std::cout << "test_inferior_code used " << end-bgn << "ms/n";
      
       bgn = clock();
       test_excellent_code(cnt, str);
       end = clock();
       std::cout << "test_excellent_code used " << end-bgn << "ms/n";
      
       return 0;
}
分析:
在我的机器(配置和编译执行环境见文后)上,上例的输出如下:
$ ./no_inferior_code1.exe
test_inferior_code used 4336ms
test_excellent_code used 3485ms
可以看到使用赋值操作符的版本执行时间是使用拷贝构造函数方式的1.2倍。这个数值并不算惊人,但绝不能不重视之;因为例子只是使用了std::string,如果是有多个元素的std::map呢,如果是用户自定义的类呢?所以勿以善小而不为,勿以恶小而为之,养成尽量使用拷贝构造函数的习惯非常重要。
上面的例子不太可能出现在我们的代码中,现实中最容易出现这种劣化代表的情况是这样的:
class A
{
public:
A(const std::string& str){_str = str;}
private:
       std::string _str;
};
这样的代码很容易看到,其实就是一种劣化的代码。比较好的写法是这样的:
public:
       A(const std::string& str):_str(str){}
使用构造列表来初始化成员变量。
扩展:
一路谈来都是使用STL等别人的库,那么如果自己要写一个类给其他人使用的时候,应该注意些什么吗?是的,我们应该提供能让他人写出excellent代码的接口或者方法。简单地说,如果我们提供的类重载了赋值操作符,那么就应该相应地提供一个拷贝构造函数;反过来,如果提供了拷贝构造函数,那也需要重载赋值操作符。如果你并不打算这样做,那一定要把你不提供的接口声明为private或者protected,以免编译器自动生成它,造成误会。
class A
{
public:
       A(const A& a):_str(a._str){}
       A& operator=(const A& a){_str = a.str;return *this;}
       std::string str;
};
上面的代码是一个还算过得去的例子~

避免劣化代码(No Inferior Code)之一相关推荐

  1. Android 组件化代码中心化问题之.api化方案

    theme: channing-cyan highlight: a11y-light 一.代码中心化问题 将一个大型的项目拆分成多个Module或者新开的组件化项目,想要的预期是这些module之间是 ...

  2. 代码大全(Code Complete)-- 目录和关键点

    读后感 <代码大全>是一本指导"代码构建"的书,指导我们如何写出优秀的代码,如何成为优秀的程序员. 这样一本900多页的大部头书,当我们基于既往的编程经验,在读每一个部 ...

  3. openEuler A-Ops通用场景TCP传输性能劣化检测工具开发报告

    --开源软件开发导论项目实践总结报告 摘要:本项目是应用openEuler A-Ops项目中的gala-gopher组件而开发的通用场景下TCP传输性能劣化检测工具,主要功能是通过对gala-goph ...

  4. 如何进行代码评审(Code Review)

    什么是CodeReview Code Review(CR)即代码评审,是一种通过复查代码来提高代码质量的过程,一般体现在一个团队的开发过程中.CR要求团队成员有意识地.系统地检查彼此的代码,从而验证需 ...

  5. 获取线程结束代码(Exit Code)

    线程结束代码可以调用GetExitCodeThread()(并给予CreateThread所获得的线程handle作为参数)而得知: BOOL GetExitCodeThread(HANDLE hTh ...

  6. ANSI编码和标准代码页(code page)

    电脑最先是美国人发明出来开始使用的,他们觉得一个字节(可以表示256个编码)表示英语世界里所有的字母.数字和常用特殊符号已经绰绰有余了(其实ASCII只用了前127个编码)于是他们使用ASCII编码, ...

  7. CKEditor代码高亮显示插件Code Snippet安装及使用方法

    CKEditor网页编辑器 CKEditor 即 FCKEDITOR .FCKeditor是目前最优秀的可见即可得网页编辑器之一,它采用JavaScript编写.具备功能强大.配置容易.跨浏览器.支持 ...

  8. 15个最佳的代码评审(Code Review)工具

    代码评审可以被看作是计算机源代码的测试,它的目的是查找和修复引入到开发阶段的应用程序的错误,提高软件的整体素质和开发者的技能.代码审查程序以各种形式,如结对编程,代码抽查等.在这个列表中,我们编制了1 ...

  9. UPS蓄电池的内阻没有参考值,如何才能发现劣化蓄电池?

    专业的蓄电池维护人员都知道,电池如果发生劣化,只有在接近损毁的后期才能显示出明显的电压异常.因此,虽然基站和机房的电池都装有在线的电压监控系统,但是仅在线监测电压是不够的,定期检测电池内阻才能提前发现 ...

最新文章

  1. GBDT 算法如何用于分类问题
  2. 为什么nodejs是单进程的_nodejs真的是单线程吗?
  3. 多款 Linux 发行版悄然放弃支持 PowerPC
  4. 机器学习:从入门到第一个模型
  5. 【转】visual studio 2012进行C语言开发[图文]
  6. halcon edges_sub_pix算子
  7. C#实现写入文本文件内容功能
  8. ubuntu16.04下安装NS-2.35以及对simple例的理解
  9. 软件测试入门笔记(一)
  10. Linux内核调试方法总结【转】
  11. sql 查询一个月的数据按天显示_数据分析-sql复杂查询
  12. Django框架详细介绍---认证系统
  13. 计算机二级Python公共基础部分
  14. 如何快速给PDF挂接目录书签
  15. 轻松搞懂word2vec / FastText + SVM(支持向量机)实现中英文情感分类
  16. oracle手动删除dbf文件,oracle删除DBF文件
  17. 如何导出计算机硬盘重数据,硬盘对拷教程,100%保存原硬盘数据
  18. Android ---创建APP数据库
  19. html背景斜线,巧妙的实现 CSS 斜线(炫酷的小效果)
  20. 全景看房vr全景展示,获得360度全景式视角实时交互体验

热门文章

  1. 数字信号处理——采样定理
  2. ijkplayer源码分析 音频解码流程
  3. 如何根据已有的下载路径下载文件并重命名文件
  4. 如何用计算机扫描,如何使用打印机操作面板的扫描至计算机功能?
  5. Weego工作室简介
  6. 月是故乡明 中秋主题相册制作
  7. typora 备份与恢复未保存的文章
  8. mysql内存机制_浅析Oracle 的体系架构及内存分配机制
  9. mysql对英文忽略字符集_非英文网站如何使用MySQL的字符集
  10. 微信消灭病毒哪个服务器好,消灭病毒怎么玩 微信小程序98k攻略