首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 编程交流与学习--More Effective C++的学习-Item M17:考虑使用lazy evaluation(懒惰计算法)
【标  题】:编程交流与学习--More Effective C++的学习-Item M17:考虑使用lazy evaluation(懒惰计算法)
【关键字】:--More,Effective,C++,-Item,M17,lazy,evaluation
【来  源】:http://blog.csdn.net/swordll80/archive/2006/10/15/1335982.aspx

编程交流与学习--More Effective C++的学习-Item M17:考虑使用lazy evaluation(懒惰计算法)

 
从效率的观点来看,最佳的计算就是根本不计算.关键是要懒惰。lazy evaluation(懒惰计算法)。 eager evaluation(热情计算).
l         引用计数
String s1 = "Hello";
String s2 = s1;                 / 调用string拷贝构造函数
    通常string拷贝构造函数让s2被s1初始化后,s1和s2都有自己的”Hello”拷贝。这种拷贝构造函数会引起较大的开销。然而这时的s2并不需要这个值的拷贝,因为s2没有被使用。
    lazy evaluation:除非你确实需要,不去为任何东西制作拷贝。我们应该是懒惰的,只要可能就共享使用其它值。
l         区别对待读取和写入
    继续讨论上面的reference-counting string对象。来看看使用lazy evaluation的第二种方法。考虑这样的代码:
String s = "Homer's Iliad";            // 假设是一个reference-counted string
cout << s[3];                         // 调用 operator[] 读取s[3]
s[3] = 'x';                           // 调用 operator[] 写入 s[3]
    我们应能够区别对待读调用和写调用,因为读取reference-counted string是很容易的,而写入这个string则需要在写入前对该string值制作一个新拷贝。通过使用lazy evaluation和条款M30中讲述的proxy class,我们可以推迟做出是读操作还是写操作的决定,直到我们能判断出正确的答案。
l         Lazy Fetching(懒惰提取)
    因为LargeObject对象实例很大,为这样的对象获取所有的数据,数据库的操作的开销将非常大,特别是如果从远程数据库中获取数据和通过网络发送数据时。而在这种情况下,不需要读去所有数据。当LargeObject对象被建立时,不从磁盘上读取所有的数据,这样懒惰法解决了这个问题。不过这时建立的仅是一个对象“壳”,当需要某个数据时,这个数据才被从数据库中取回。
l         Lazy Expression Evaluation(懒惰表达式计算)
Matrix<int> m1(1000, 1000);                   // 一个 1000 * 1000 的矩阵
Matrix<int> m2(1000, 1000);                   // 同上
Matrix<int> m3 = m1 + m2;                     // m1+m2
    lazy evaluation方法说这样做工作太多,所以还是不要去做。
cout << m3[4];                                // 打印m3的第四行
    很明显,我们不能再懒惰了,应该计算m3的第四行值。
    实际上lazy evaluation就存在于APL语言中。APL是在1960年代发展起来语言,能够进行基于矩阵的交互式的运算。那时侯运行它的计算机的运算能力还没有现在微波炉里的芯片高,APL表面上能够进行进行矩阵的加、乘,甚至能够快速地与大矩阵相除!它的技巧就是lazy evaluation。这个技巧通常是有效的,因为一般APL的用户加、乘或除以矩阵不是因为他们需要整个矩阵的值,而是仅仅需要其一小部分的值。APL使用lazy evaluation 来拖延它们的计算直到确切地知道需要矩阵哪一部分的结果,然后仅仅计算这一部分。
 
康托尔、哥德尔、图灵——永恒的金色对角线:【上一篇】
用VC写Assembly代码(7)--在Visual C++中使用内联汇编:【下一篇】
【相关文章】
  • C++ convert int to string
  • C++函数对象学习笔记
  • 关于 C/C++ 的输入输出缓冲
  • 为Dev-C++安装设置OpenCV
  • C++ string类型
  • C++ 中指针和引用的区别
  • Dev-C++中察看运行程序结果
  • C++相关书籍推荐
  • 研究生,请你拒绝C++的爱(中)
  • 我的第一个 C++ 配合 XML以及GameMonkey脚本的DEMO程序
  • 【随机文章】
  • RPG制作之路(ZT)
  • 如何避免重复包含一个头文件?#ifndef #define #endif #Pragma
  • 看上去很美
  • JScrollPane实现自动滚动到底部
  • Windows驱动程序基本的Inf文件框架
  • Illustrator 8.0 入门基础教程(9)
  • 常用手持设备的use-agent头信息
  • 游戏显卡与专业显卡的区别
  • 《windows核心编程》之精华
  • 如何启动故障恢复控制台
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.