首页 > 编程语言 > 详细

【读书笔记之More Effective C++】程序运行效率

时间:2014-01-21 19:20:03      阅读:391      评论:0      收藏:0      [点我收藏+]

书目:《More Effective C++》

[1]80-20准则

影响程序效率的代码占20%。不要凭直观来确定影响程序效率的代码段。通过时间测量,以及内存分配和释放的次数来分析程序的瓶颈。(条款16)

[2]延迟操作里面的延迟读取,在Hibernate里面就有相应的运用成为“懒加载”,后面有空的话就学习一下这些代码。(条款17)

[3]使用mutable关键字修饰字段,可以使该字段在const函数当中被修改。

因为我们知道,在类的const函数当中,所有的成员变量都会被当作const类型处理。事实上后面提到的把this的const强制却掉的做法也正说明了这一点。

一般来说,this这个关键字的类型应该是 A *const,其中A代指类名。那么this是不可以指向其他对象的,但this指向的对象的内容是可以被修改的。所以我们在非const函数里面修改成员变量是没有问题的。

const函数当中之所以不能修改,就是因为改函数里面的this指针类型是:const A * const,哈哈,再说一遍,const函数的const关键字似乎只干了这么一件事,所以只要我们想办法拿到一个类型为A* const的this就想干嘛干嘛了。

这是不是有点儿像在干坏事儿。。

于是出现了下面的代码:

TestPNew* const p = const_cast<TestPNew*>(this);
    p->b = "1";

TestPNew是我测试代码的类名(当时用来测试placement new的。。)。我们把this进行强转以后,p就成了真正掌握实权的this,而真正的this就退居二线了。

不得不再次感慨一下C++里面给我们程序员留了太多好玩的东西哈哈。

(条款17)

[4]预算。

我们在使用vector这样的容器的时候,分配内存的时候因为不知道后面会有多少元素添加进来,所以为了避免执行多次分配操作,就一次性分配超过当前需求的空间。这一点在Java的ArrayList里面也能看到,初始化的时候并不是初始化了一个对象,也为后面可能添加的元素分配了一个合适的空间(比如默认是几个来着。。)

(条款18)

[5]关注临时对象。

首先明确临时对象的概念:不能是在堆上分配的内存,因为如果在堆上分配内存的话(new)要显示的delete;没有名字。

临时对象的产生情景:

1.以传值的方式传递给声明为常量引用的参数会产生临时对象。因为这时产生的临时对象仅仅作为内部运算的初始值,而不会影响到外部作用域的数据变化。

那么如果不是传递给常量引用的话,内部的逻辑可能会修改外部对象的值(引用指向的对象),那么这时产生临时对象来实现隐式类型转换企图敷衍过去的做法根本是个错误,所以编译器不允许你这么对不起自己。(条款19)

可以通过构造函数来改变这一现状。(条款21)

2.函数返回值返回对象。这个比较常见,但也经常不可避免。之前写代码的时候因为对这块还没有形成概念,所以经常胡乱返回引用,惹编译器生气。(条款19)

返回值优化这个概念的出现,实际上是编译器玩了一个花样而已。在返回值的时候,return后面调用一个构造函数,那么类似 A a = getA()这样的代码,函数里面调用的构造函数就好像是为a的初始化调用的一样,那么只需要调用一次就够了,因而也不会产生临时对象。

稍稍测试了一下,如果代码写成这样:

TestPNew getInst1(){
    TestPNew p(0);
    return p;
}

那么会调用构造函数构造p,之后调用复制构造函数拷贝出去。如果按照上面方法优化之后,就只会调用一次构造函数了。需要指出的是,如果声明了传入右值引用的复制构造函数,A(const A&&)这样的,那么复制的时候会调用这个复制构造(vs2012已经支持这一特性)。(条款20)

实际上返回值的场景比较常见于运算符重载。本书推荐的方式是使用类似于+=这样的运算符,而不实用+这样的运算符,因为后者可能比前者产生更多的临时对象。(条款22)

【读书笔记之More Effective C++】程序运行效率

原文:http://www.cnblogs.com/enbandari/p/3528225.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!