手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

理解inline化的介入和排除 (2)

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

max 是个模板的事实引出一个观察结论:inline 函数和模板一般都是定义在头文档中的。这就使得一些程式员得出结论断定函数模板必须是 inline。这个结论是非法的而且有潜在的危害,所以他值得我们考察一下。 inline 函数一般必须在头文档内,因为大多数构建环境在编译期间进行 inline 化。为了用被调用函数的函数本体替换一个函数调用,编译器必须知道函数看起来像什么样子。(有一些构建环境能够在连接期间进行 inline 化,更有少数几个——比如,基于 .NET Common Language Infrastructure (CLI) 的控制环境——居然能在运行时 inline 化。然而,这些环境都是例外,并非规则。inline 化在大多数 C 程式中是个编译时行为。)

  模板一般在头文档内,因为编译器需要知道一个模板看起来像什么以便用到他时对他进行实例化。(同样,也不是全部如此。一些构建环境能够在连接期间进行模板实例化。然而,编译期实例化更为普遍。) 模板实例化和 inline 化无关。假如您写了一个模板,而且您认为任何从这个模板实例化出来的函数都应该是 inline 的,那么就声明这个模板为 inline,这就是上面的 std::max 的实现被做的事情。但是假如您为没有理由要 inline 化的函数写了一个模板,就要避免声明这个模板为 inline(无论显式的还是隐式的)。inline 化是有成本的,而且您不希望在毫无预见的情况下遭遇他们。我们已说到 inline 化是如何引起代码膨胀的,但是,更有其他的成本,过一会儿我们再讨论。

  在做这件事之前,我们先来完成对这个结论的考察:inline 是个编译器可能忽略的请求。大多数编译器拒绝他们认为太复杂的 inline 函数(例如,那些包含循环或递归的),而且,除了最细碎的以外的全部虚拟函数的调用都不会被 inline 化。不应该对这后一个结论感到惊讶。虚拟意味着“等待,直到运行时才能断定哪一个函数被调用”,而 inline 意味着“执行之前,用被调用函数取代调用的地方”。假如编译器不知道哪一个函数将被调用,您很难责备他们拒绝 inline 化这个函数本体。

  任何这些加在一起,得出:一个被指定的 inline 函数是否能真的被 inline 化,取决于您所使用的构建环境——主要是编译器。幸运的是,大多数编译器都有一个诊断层次,在他们不能 inline 化一个您提出的函数时,会导致一个警告。

  有时候,即使当编译器完全心甘情愿地 inline 化一个函数,他们还是会为这个 inline 函数生成函数本体。例如,假如您的程式要持有一个 inline 函数的地址,编译器必须为他生成一个 outlined 函数本体。他们怎么能生成一个指向根本不存在的函数的指针呢?再加上,编译器一般不会对通过函数指针的调用进行 inline 化,这就意味着,对一个 inline 函数的调用可能被也可能不被 inline 化,依赖于这个调用是如何做成的:

inline void f() {...} // assume compilers are willing to inline calls to f

void (*pf)() = f; // pf points to f
...

f(); // this call will be inlined, because it’s a "normal" call
pf(); // this call probably won’t be, because it’s through
// a function pointer




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS