用户操作
[即时聊天] [发私信] [加为好友]
错误ID:fatalerror99
215327次访问,排名323好友0人,关注者4
还好
fatalerror99的文章
原创 24 篇
翻译 80 篇
转载 5 篇
评论 384 篇
fatalerror99的公告
Copyleft © 2005 - 2008 by fatalerror99 (iTePub's Nirvana)

本 BLog 所有文章除注明转载者外,均为本人原创或翻译,欢迎转载。转载时请保持文章完整并注明出处。

强烈推荐使用 Mozilla Firefox 浏览本 BLog。

MSN: fatalerror9999@hotmail.com

e-mail: kong_kong@163.com

最近评论
fatalerror99:楼上说得对,原来的翻译确实错了,而且 object 应该都是单数,不是复数。
jjy:"每一件适用于 B objects(对象)的事情也适用于 D objects(对象),因为每一个 D objects 都 is-a(是一个)D objects(对象);" 应该是"因为每一个 D objects 都 is-a(是一个)B objects(对象);""
jjy:"一旦 derived class destructor(派生类析构函数)运行,这个 object(对象)的 derived class data members(派生类数据成员)就呈现为未定义的值,所以 C++ 就将它们视为不再存在。"
应该是base class destructor运行时...
七星瓢企鹅:央视的新楼盖起来了,听说北京人照例给他起了个外号叫“大裤衩”
mopyman:严重鄙视此人
turingbook
简直是利欲熏心
文章分类
收藏
    相册
    Effective C++, 3rd Edition 插图
    数学公式
    Our Projects
    boost 文档汉化 boost_doc_translation(RSS)
    不服不行
    Bjarne Stroustrup
    Alexander A. Stepanov
    Andrei Alexandrescu
    Bruce Eckel
    Charles Petzold
    Chris Sells
    David R. Musser
    Dennis M. Ritchie
    Donald E. Knuth
    Herb Sutter
    James Gosling
    Nicolai M. Josuttis
    Scott Meyers
    Stanley B. Lippman
    侯捷
    荣耀
    精点 BLog
    水瓶水蓝
    水瓶水蓝 —— 晃荡在阴阳两界的魂儿
    (RSS)
    CityLife 的流水账(RSS)
    为艺术而技术(RSS)
    乱发当风(RSS)
    微起涟漪 —— basse(RSS)
    暗金色月亮的赫拉迪克宝盒(RSS)
    杏坛雨的博客(RSS)
    王晓渔:书中自有……(RSS)
    开发 BLog
    alai04 的专栏(RSS)
    C++ 的罗浮宫(RSS)
    Coofucoo's Blog--The Unadulterated Coofucoo(RSS)
    GreenCode's Blog(RSS)
    ilovevc 的专栏(RSS)
    lxwde 的专栏(RSS)
    oiramario(RSS)
    ralph623 的专栏(RSS)
    renco 的专栏(RSS)
    Scorpio Auding @ Blog++(RSS)
    SnowFalcon 的专栏(RSS)
    Stan Lippman's BLog(RSS)
    Sutter's (Online) Mill(RSS)
    切尔斯基(RSS)
    周星星 之 Blog(RSS)
    孟岩(RSS)
    开心就好的代码人生(RSS)
    心如止水 —— coofucoo 的专栏(RSS)
    方舟(RSS)
    歌谣在风中飘舞(RSS)
    空谷幽兰,心如皓月 —— 陈皓专栏(RSS)
    艺术编程(RSS)
    透明思考 - 1(RSS)
    透明思考 - 2(RSS)
    陈硕的 Blog(RSS)
    开发网站
    CSDN.NET
    artima devdloper: Best practices in enterprise software development
    Experts Exchange
    IBM DeveloperWorks
    IBM DeveloperWorks 中国(RSS)
    Programmers' Heaven
    The Artima Developer Community
    The Code Project
    卡卡社区
    开发语言与环境
    (CHEZ (CHEZ SCHEME))
    .NET Languages
    PHP: Hypertext Preprocessor
    Eclipse.org home
    Python Programming Language
    REBOL Technologies
    ActiveState
    D Programming Language
    Eclipse Plugins
    Eclipse Plusin Central
    Eiffel Software
    GCL - GNU Common Lisp
    GNU Compiler Collection (GCC)
    Groovy
    IronPython
    NetBeans IDE
    Perl
    Ruby on Rails
    Ruby Programming Language
    The Programming Language Lua
    坛子若干
    iTePub
    自由小店 —— iTePub 共建共享电子图书交互平台
    (RSS)
    ChinaJavaWorld.com 技术论坛
    ChinaUnix
    CSDN 技术社区 —— 这个不说大家也知道
    Huihoo - Open Source Community
    ITPUB 论坛
    卡卡社区
    网络书店
    Amazon.com
    China-Pub 网上书店
    joyo Amazon 卓越亚马逊
    第二书店
    有一杯咖啡叫做 Java
    Hibernate
    Java Technology
    JavaWorld
    jGuru
    Spring Framework
    The Apache Software Foundation
    TheServerSide.COM: Your Enterprise Java Community
    有一部经典叫做 C++
    Boost C++ Libraries
    C Programming and C++ Programming
    C/C++ Reference
    cplusplus.com
    Programming in C++, Rules and Recommendations
    The ADAPTIVE Communication Enviroment (ACE)
    The C Standards Committee (ISO C)
    The C++ Standard Committee (ISO C++)
    有一只企鹅叫做 Linux
    Debian
    Fedora Project
    Linux Journal
    Linux Online!
    Linux 伊甸园
    Linux.com
    Red Hat
    SUSE Linux Enterprise from Novell
    The Linux Foundation
    The Linux Kernel Archives
    Ubuntu
    有一种自由叫做开源
    OpenBSD
    CodeGuru
    FreeBSD
    FSF - The Free Software Foundation
    GNU
    Huihoo - Open Source Community
    Open Source Initiative (OSI)
    OpenSolaris
    SourceForge.net
    The Open Enterprise Foundation (OEF)
    专业出版机构
    Addison-Wesley
    APress
    Manning Publications Co.
    McGraw-Hill
    O'Reilly
    Prentice Hall PTR
    Wiley
    Wordware Publishing, Inc.
    Wrox
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    翻译 [翻译] Effective C++, 3rd Edition, Item 44: 从 templates(模板)中分离出 parameter-independent(参数无关)的代码(上)收藏

    新一篇: [n年以前的诗] 漂亮姑娘 | 旧一篇: [n年以前的诗] 你别这样

    Item 44: 从 templates(模板)中分离出 parameter-independent(参数无关)的代码

    作者:Scott Meyers

    译者:fatalerror99 (iTePub's Nirvana)

    发布:http://blog.csdn.net/fatalerror99/

    templates(模板)是节省时间和避免代码重复的极好方法。不必再输入 20 个相似的 classes,每一个包含 15 个 member functions(成员函数),你可以输入一个 class template(类模板),并让编译器实例化出你需要的 20 个 specific classes(特定类)和 300 个函数。(class template(类模板)的 member functions(成员函数)只有被使用时才会被隐式实例化,所以只有在每一个函数都被实际使用时,你才会得到全部 300 个 member functions(成员函数)。)function templates(函数模板)也有相似的魅力。不必再写很多函数,你可以写一个 function templates(函数模板)并让编译器做其余的事。这不是很重要的技术吗?

    是的,不错……有时。如果你不小心,使用 templates(模板)可能导致 code bloat(代码膨胀):重复的(或几乎重复的)的代码,数据,或两者都有的二进制码。结果会使源代码看上去紧凑而整洁,但是目标代码臃肿而松散。臃肿而松散很少会成为时尚,所以你需要了解如何避免这样的二进制扩张。

    你的主要工具有一个高高在上的名字 commonality and variability analysis(通用性与可变性分析),但是这个想法本身并没有那么高高在上。即使在你的职业生涯中从来没有使用过模板,你也应该从始至终做这样的分析。

    当你写一个函数,而且你意识到这个函数的实现的某些部分和另一个函数的实现本质上是相同的,你会仅仅复制代码吗?当然不。你从这两个函数中分离出通用的代码,放到第三个函数中,并让那两个函数来调用这个新的函数。也就是说,你分析那两个函数以找出那些通用和变化的构件,你把通用的构件移入一个新的函数,并把变化的构件保留在原函数中。类似地,如果你写一个 class,而且你意识到这个 class 的某些构件和另一个 class 的构件是相同的,你不要复制那些通用构件。作为替代,你把通用构件移入一个新的 class 中,然后你使用 inheritance(继承)或 composition(复合)(参见 Items 323839)使得原来的 classes 可以访问这些通用特性。原来的 classes 中不同的构件——变化的构件——仍保留在它们原来的位置。

    在写 templates(模板)时,你要做同样的分析,而且用同样的方法避免重复,但这里有一个技巧。在 non-template code(非模板代码)中,重复是显式的:你可以看到两个函数或两个类之间存在重复。在 template code(模板代码)中。重复是隐式的:仅有一份 template(模板)源代码的拷贝,所以你必须培养自己去判断在一个 template(模板)被多次实例化后可能发生的重复。

    例如,假设你要为固定大小的 square matrices(正方矩阵)写一个 templates(模板),其中,要支持 matrix inversion(矩阵求逆)。

    template<typename T,           // template for n x n matrices of
             std::size_t n>        // objects of type T; see below for info
    class SquareMatrix {           // on the size_t parameter
    public:
      ...
      void invert();               // invert the matrix in place
    };

    这个 template(模板)取得一个 type parameter(类型参数)T,但是它还有一个类型为 size_t 的参数——一个 non-type parameter(非类型参数)。non-type parameter(非类型参数)比 type parameter(类型参数)更不通用,但是它们是完全合法的,而且,就像在本例中,它们可以非常自然。

    现在考虑以下代码:

    SquareMatrix<double, 5> sm1;
    ...
    sm1.invert();                  // call SquareMatrix<double, 5>::invert

    SquareMatrix<double, 10> sm2;
    ...
    sm2.invert();                  // call SquareMatrix<double, 10>::invert

    这里将有两个 invert 的拷贝被实例化。这两个函数是不相同的,因为一个作用于 5 x 5 矩阵,而另一个作用于 10 x 10 矩阵,但是除了常数 5 和 10 以外,这两个函数是相同的。这是一个发生 template-induced code bloat(模板导致的代码膨胀)的经典方法。

    如果你看到两个函数除了一个版本使用了 5 而另一个使用了 10 之外,对应字符全部相等,你该怎么做呢?你的直觉让你创建一个取得一个值作为一个参数的函数版本,然后用 5 或 10 调用这个参数化的函数以代替复制代码。你的直觉为你提供了很好的方法!以下是一个初步过关的 SquareMatrix 的做法:

    template<typename T>                   // size-independent base class for
    class SquareMatrixBase {               // square matrices
    protected:
      ...
      void invert(std::size_t matrixSize); // invert matrix of the given size
      ...
    };

    template<          typename T, std::size_t n>
    class SquareMatrix: private SquareMatrixBase<T> {
    private:
      using SquareMatrixBase<T>::invert;   // avoid hiding base version of
                                           // invert; see Item 33
    public:
      ...
      void invert() { this->invert(n); }   // make inline call to base class
    };                                     // version of invert; see below
                                           // for why "this->" is here

    就像你能看到的,invert 的参数化版本是在一个 base class(基类)SquareMatrixBase 中的。与 SquareMatrix 一样,SquareMatrixBase 是一个 template(模板),但与 SquareMatrix 不一样的是,它参数化的仅仅是矩阵中的对象的类型,而没有矩阵的大小。因此,所有持有一个给定对象类型的矩阵将共享一个单一的 SquareMatrixBase class。从而,它们共享 invert 在那个 class 中的版本的单一拷贝。

    SquareMatrixBase::invert 仅仅是一个计划用于 derived classes(派生类)以避免代码重复的方法,所以它是 protected 的而不是 public 的。调用它的额外成本应该为零,因为 derived classes(派生类)的 inverts 使用 inline functions(内联函数)调用 base class(基类)的版本。(这个 inline 是隐式的——参见 Item 30。)这些函数使用了 "this->" 标记,因为就像 Item 43 解释的,如果不这样,在 templatized base classes(模板化基类)中的函数名(诸如 SquareMatrixBase<T>)被 derived classes(派生类)隐藏。还要注意 SquareMatrixSquareMatrixBase 之间的继承关系是 private 的。这准确地反映了 base class(基类)存在的理由仅仅是简化 derived classes(派生类)的实现的事实,而不表示 SquareMatrixSquareMatrixBase 之间的一个概念上的 is-a 关系。(关于 private inheritance(私有继承)的信息,参见 Item 39。)

    迄今为止,还不错,但是有一个棘手的问题我们还没有提及。SquareMatrixBase::invert 怎样知道应操作什么数据?它从它的参数知道矩阵的大小,但是它怎样知道一个特定矩阵的数据在哪里呢?大概只有 derived class(派生类)才知道这些。derived class(派生类)如何把这些传达给 base class(基类)以便于 base class(基类)能够做这个转置呢?

    一种可能是为 SquareMatrixBase::invert 增加另一个的参数,也许是一个指向存储矩阵数据的内存块的开始位置的指针。这样可以工作,但是十有八九,invert 不是 SquareMatrix 中仅有的能被写成一种 size-independent(大小无关)的方式并移入 SquareMatrixBase 的函数。如果有几个这样的函数,全都需要一种找到持有矩阵内的值的内存的方法。我们可以为它们全都增加一个额外的参数,但是我们一再重复地告诉 SquareMatrixBase 同样的信息。这看上去不太正常。

    (未完,点击此处,接下篇)

    发表于 @ 2005年12月22日 00:38:00|评论(loading...)|编辑

    新一篇: [n年以前的诗] 漂亮姑娘 | 旧一篇: [n年以前的诗] 你别这样

    评论

    #qxj 发表于2005-12-22 08:48:00  IP: 60.191.53.*
    赞,又开始了,加油,早日完成
    #fatalerror99 发表于2005-12-22 09:26:00  IP: 211.94.229.*
    不会太快的,这不是又一轮快速更新的开始,这些天一直在抽空翻译,也就翻译了这些。后面估计也就是这个速度,快不到哪去了。
    #__dwp__ 发表于2005-12-28 09:22:00  IP: 211.155.252.*
    翻译的不错,加油
    #as 发表于2005-12-28 16:49:00  IP: 58.66.130.*
    xfd
    #billjoy 发表于2005-12-28 14:17:00  IP: 219.144.130.*
    一直在顶,加油~~~~
    #ligand 发表于2007-05-16 11:29:53  IP: 202.101.8.*
    matrix inversion是求矩阵的逆;
    矩阵转置是transpose
    #fatalerror99 发表于2007-05-21 21:32:59  IP: 218.68.33.*
    确实是翻译错了,多谢楼上指出这个错误。
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © fatalerror99