刀不磨会生锈,久了不编程,也会忘记很多关键的东西,其中之一就是会把日常编程中应当注意的问题忘记,慢慢地写的代码就很烂了,不忍卒读.....
编程是一门细致活儿,有很多陷阱,其中之一是我们容易编写劣化的代码,相当多的人都想不通自己写的代码怎么写都没有人家的执行起来有效率,所以在这里我就写一些自己掌握的这方面的知识,一来是防止自己忘却,二来是与大家分享,特别是初学编程者。
相当一部分人会认为我写出来的内容应该算是代码优化层面,我是不这样认为的。我认为编程中优化不可过早,但避免劣化代码却要时刻进行。我这里谈的内容有些是老生常谈,那我就深入挖掘,力求旧瓶有新酒;有些是鲜为人知,那我就详言细述,力求深入浅出。
关于避免代码劣化这个话题,将不限于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;
};
上面的代码是一个还算过得去的例子~
分享到:
相关推荐
标题“INFERIOR”在IT领域中可能是指一种特定的字体风格或技术,尤其是在排版、设计和打印行业中。在字体设计中,“INFERIOR”通常代表下标,即字符位置低于基线的小写字母或数字,常用于科学公式、化学方程式或脚注...
"Major mode for Emacs for editing MATLAB code, and running MATLAB in an inferior shell" 是一个专门为在Emacs中编辑MATLAB代码设计的模式,它增强了Emacs对MATLAB的支持,使得用户可以直接在编辑器内部运行...
Visual Studio Code(简称VSCode)是由微软开发的一款免费、跨平台的源代码编辑器,它在编程界广受欢迎,尤其适合Web和云应用的开发。VSCode 1.51.1是AMD64架构的一个特定版本,适用于64位操作系统。这个版本的DEB包...
在IT领域,尤其是在软件开发中,调试器是一个至关重要的工具,它帮助开发者找出代码中的错误和问题。"qtcreatorcdbext.rar"这个压缩包文件似乎与Qt Creator集成开发环境(IDE)和调试器的扩展有关,特别是针对"the ...
- `getcube.m`、`select.m`、`getDS.m`、`dist.m`、`SP.m`、`inferior.m`、`MS.m`:这些辅助函数分别用于处理多目标问题中的不同任务,如计算距离、选择非劣解、处理支配关系等。 通过理解并实践这些脚本,初学者...
4. 实例归一化模块:实例归一化模块是一种神经网络模块,用于取代批量归一化模块,以提高图像风格化的质量。 5. Julesz 纹理ensemble:Julesz 纹理ensemble是一种等价类,用于表征所有图像的纹理或风格,该ensemble...
STP(Spanning Tree Protocol)是一种广泛应用于以太网中的链路层协议,用于构建和维护网络拓扑结构,以避免广播风暴和环路问题的出现。RSTP(Rapid Spanning Tree Protocol)是STP的升级版本,能够更快速地响应网络...
《网络试题资源库 Web版》是一个综合性的学习平台,专为网络相关专业的学生和从业者提供丰富的练习题和学习资源。这个资源库以Web形式呈现,方便用户通过浏览器进行访问和学习,无需安装额外的客户端软件。 锐智...
组胺的作用机制:组胺是一种生物活性胺,在人体和动物体内作为化学信使发挥着重要作用。它在中枢神经系统中能够通过特定的受体来影响神经元的活性。研究指出组胺通过H1和H2受体兴奋大鼠前庭下核的神经元。H1和H2受体...
matlab一种图像分割代码视网膜层描绘 更新(2017 年 1 月 6 日):评估结果可用 [此处] ()(Pred 是变量名称)它对应于 [temp.mat] () (更新:Pretrained models_multiclass & models(只有trees as github forbids...
It is faster than GAs and has similar (only slightly inferior) performance. If you have been using PSO for some time, then you would definitely want to download the toolbox and modify the code to ...
- **重载控制**:可以控制何时重新加载代码,避免不必要的代码刷新。 6. **社区和文档**:SLIME拥有活跃的开发者社区,用户可以找到相关的讨论论坛、邮件列表和在线资源,以便解决遇到的问题和获取最新的开发信息...
- `rmpath`:移除已添加的搜索路径,避免无用路径影响程序执行。 - `type`:显示指定.M文件的内容。 - `help`:提供MATLAB内置函数的帮助信息。 - `version`:显示MATLAB的版本信息。 - `doc`:启动MATLAB的在线帮助...
尽管它没有图形化界面,但其强大的功能使其成为Linux下的主流调试工具之一,甚至可与Windows下的Visual Studio调试工具相媲美。 #### 三、GDB使用流程示例 下面通过一个简单的示例程序来了解GDB的基本使用流程。 ...
**Visual Studio Code (VSCode) 是一款广受欢迎的开源代码编辑器,由微软开发并维护。对于Windows 64位用户来说,它提供了一个高效、功能丰富的开发环境。本篇文章将详细探讨在Windows 64位系统上配置VSCode的过程,...
4. **“the + 比较级,the + 比较级”结构**:这种结构用来表示随着一个事物的增加,另一个事物也随之变化的关系。例如,“The more you practice, the better you become.”(你练习得越多,变得越好。) 5. **...
13. 比较级:"inferior to"表示"不如","by no means"表示"绝不",所以"by no means inferior to"表示"绝不比...差"。 14. 动词短语辨析:"set up"意为"建立",适合此处描述国际组织的成立。 15. 动词短语辨析:...
Visual Studio Code(简称VSCode)是一款由微软开发的免费、开源的代码编辑器,支持多种编程语言,并在Windows、macOS和Linux等操作系统上运行。本下载文件是针对Windows 64位系统的版本,名为"VSCodeUserSetup-x64-...
官方离线安装包,测试可用。请使用rpm -ivh [rpm完整包名] 进行安装