在ACE的源代码目录里,有源文件.cpp、头文件.h,我们还发现有以.i和.inl为扩展名的文件。其实,以.i和.inl为扩展名的文件是ACE源码中inline函数的存放形式。

  在说明ACE中为什么采用这种方式来存放inline函数之前,我们来说一下inline关键字是什么意识。我们知道当调用一个函数的时候,涉及到返回地址和参数压栈等一些操作,这些操作是函数调用本身的开销。在原来的C代码中,通常采用宏定义的方式模拟函数,来消除函数调用的开销,因此我们知道宏是在预编译时候进行处理的。但是,宏定义本身也有很多缺陷,很容易造成错误的使用。这就是inline关键字诞生的原因。用inline关键字定义的函数,在编译的时候,并不会产生真正的函数,而是在该函数调用处直接展开代码,这样就消除了函数调用的开销。注意,inline关键字,只是给编译器的一个暗示,是不是真的进行了inline处理,是由编译器决定的。

  那为什么ACE会采用这样一个特殊的方式来存放inline函呢?我们结合实例给出答案。
  我们看一下,Reactor.h文件的结尾处,有如下的处理:
  #if defined (__ACE_INLINE__)
  #include "ace/Reactor.i"
  #endif /* __ACE_INLINE__ */
  在看一下Reactor.cpp文件开头处的宏处理:
  #if !defined (__ACE_INLINE__)
  #include "ace/Reactor.i"
  #endif /* __ACE_INLINE__ */

  上面的Reactor.h,Reactor.cpp和Reactor.i文件是ACE的Reactor框架的相关代码。上面的宏定义我们很好理解,在头文件中的处理为:如果定义了宏__ACE_INLINE__,那么我们就把Reactor.i文件include到头文件中。在源文件中处理为:如果没有定义宏__ACE_INLINE__,那么就把Reactor.i文件include到源文件中。

其实有了上面inline含义的介绍,我们不难理解为什么采用这种方式来进行处理。这里我们假设定义了宏__ACE_INLINE__,并且Reactor.i文件是被include到源文件里,而不是被include头文件里,那么会产生什么后果那?我们知道inline函数,在编译器编译后,是不会产生真正的函数的,因此,如果有其它源文件,例如zhx.cpp,调用了Reactor.i文件中的inline函数,那么在连接的时候,就会抛出符号无法解析的错误,而如果Reactor.i文件是被include到了头文件中,并且我们在zhx.cpp中有调用Reactor.i文件中的函数,那么在zhx.cpp中,只需要包含Reactor.h头文件即可,则Reactor.i的相关inline函数在zhx.cpp也进行了代码展开处理。如果没有定义宏__ACE_INLINE__,则Reactor.i被include到源文件中,没有任何问题,因为Reactor.i中的函数在编译后,会产生真正的函数,而不是被inline处理。这就是ACE为什么采用这样的方式进行处理的原因。

  在上面的介绍中,我们同时也发现了inline的缺点,就是它会造成代码的膨胀。因此,不是什么样的函数都适合用inline来定义,只有那些短小的函数才适合采用inline处理。
  注:ACE为什么会采用.i和.inl两种扩展名形式的文件来存放inline函数,我还不是很清楚,但感觉以.inl形式存放的文件是早期ACE代码中的方式,后期的ACE代码采用.i方式来存放inline函数,也就是说这应该是一个历史遗留问题^_^,开源项目的缺点。

转自:https://blog.csdn.net/lwbeyond/article/details/5904536

ACE .i .inl文件(转)的更多相关文章

  1. inl文件介绍

    inl文件是内联函数的源文件.内联函数通常在C++头文件中实现,但是当C++头文件中内联函数过多的情况下,我们想使头文件看起来简洁点,能不能像普通函数那样将内联函数声明和函数定义放在头文件和实现文件中 ...

  2. CMD命令下对文件夹进行权限处理 转

    保证自己的磁盘分区格式是NTFS.FAT32是不行的. 一.Cacls.exe命令的使用 这是一个在Windows 2000/XP/Server 2003操作系统下都可以使用的命令,作用是显示或者修改 ...

  3. 【阿里云产品公测】阿里云ACE配置全程图解,详细到不行!

    作者:阿里云用户sofia 看过阿里云社区的其他技术大姥们的评测教程,感觉还是不够详细,对于一个第一次接触ace.新浪sae这类的应用来说还是比较陌生的.我最喜欢写教程了,不过我有我的风格,那就是简单 ...

  4. 【阿里云产品公测】ACE安装wordpress博客图文教程

    作者:阿里云用户51干警网 阿里云ace搭建wordpress图文教程 按照大大说的,wordpress确实能够轻松创建,只有几步.     我想说,小白的世界技术大大还是不了解.想当初我了解一下怎么 ...

  5. 【阿里云产品公测】在Laravel4框架中使用阿里云ACE的缓存服务

    作者:阿里云用户dvbhack 受论坛排版和格式限制,这篇帖子的格式不是很利于阅读,如果你看帖子觉得不那么舒服,可以看我发表在自己博客上的原文:http://www.ofcss.com/2014/04 ...

  6. 【阿里云产品公测】阿里云ACE部署通用完整教程及评测

    [阿里云产品公测]阿里云ACE部署通用完整教程及评测 作者:阿里云用户bailimei ACE应该是目前在公测的服务中应用最广泛的一项服务.在公测云引擎ACE前曾使用过新浪SAE,而ACE给我的最初印 ...

  7. C++中的INL

    inl文件介绍 inl文件是内联函数的源文件.内联函数通常在C++头文件中实现,但是当C++头文件中内联函数过多的情况下,我们想使头文件看起来简洁点,能不能像普通函数那样将内联函数声明和函数定义放在头 ...

  8. ACE的安装方法

    ACE的安装方法 下载ACE --1  ACE的主页以及下载链接 http://www.cs.wustl.edu/~schmidt/ACE.html 安装ACE --1  将ACE-5.5.tar.g ...

  9. ACE的构建(VC++6.0环境)

    ACE的构建(VC++6.0环境)Windows下ACE的构建1. 将ACE-5.5.zip解压到所需的安装目录,此处以E:/为例,解压后形成ACE_wrappers文件夹,因此ACE将会存在于ACE ...

随机推荐

  1. 开源项目DataTimePicker实现时间和日期的选择

       这个开源项目是模仿Google官方的time选择器做的,是否漂亮.让我爱不释手,真心喜欢.很有幸和大家一起分享下,那么话不多说开始讲解. 开源项目地址:https://github.com/fl ...

  2. Scrollbar中滚动条的设置

      insideOverlay 默认值,表示在padding区域内并且覆盖在view上 insideInset 表示在padding区域内并且插入在view后面 outsideOverlay 表示在p ...

  3. Java比较两个Date日期的大小

    import java.util.*; import java.text.ParseException; import java.text.SimpleDateFormat; class Test{ ...

  4. 优化算法动画演示Alec Radford's animations for optimization algorithms

    Alec Radford has created some great animations comparing optimization algorithms SGD, Momentum, NAG, ...

  5. Eclipse国内镜像源配置方法

    Table of Contents 我们在国内从官网下载Eclipse以及插件非常慢,那么,有没有方法变快呢? 有,那就是使用国内的公开镜像源替换官方源. 1 下载Eclipse 首先,我们看一个链接 ...

  6. 不越狱安装破解软件,iResign重签名方法

    http://www.baidu.com/s?wd=iresign%E8%BD%AF%E4%BB%B6&rsv_spt=1&issp=1&rsv_bp=0&ie=utf ...

  7. asp.net为什么会产生app_offline.htm 这个文件,为什么删除后运行浏览器就不会报应用程序脱机

    一般是发布的时候自动生成的.VS2008在发布程序的时候,会首先在网站目录中生成这个文件,并把该虚拟目录的首页设成这个文件. 这样你在发布程序的时候如果有人访问网站就会看到这个页面. 不影响发布.ap ...

  8. ptime概述

    官方给出的ptime的定义是:ptime gives the length of time in milliseconds represented by themedia in a packet.简单 ...

  9. ASP.NET MVC:WebPageRenderingBase.cs

    ylbtech-funcation-Utility: ASP.NET MVC:WebPageRenderingBase.cs 提供用于呈现使用 Razor 视图引擎的页的方法和属性. 1.A,WebP ...

  10. Kyoto Cabinet 使用及原理

    Kyoto Cabinet 基本规格书 如果你知道 Tokyo Cabinet ,那么就应该知道 Kyoto Cabinet,因为他们都是同一个作者(平林幹雄)开发出来的 Key-Value 数据库. ...