gcc标准,c++中的inline

1. GCC的inline
gcc对C语言的inline做了自己的扩展,其行为与C99标准中的inline有较大的不同。

1.1. static inline
GCC的static
inline定义很容易理解:你可以把它认为是一个static的函数,加上了inline的属性。这个函数大部分表现和普通的static函数一样,只
不过在调用这种函数的时候,gcc会在其调用处将其汇编码展开编译而不为这个函数生成独立的汇编码。除了以下几种情况外:
函数的地址被使用的时候。如通过函数指针对函数进行了间接调用。这种情况下就不得不为static inline函数生成独立的汇编码,否则它没有自己的地址。
其他一些无法展开的情况,比如函数本身有递归调用自身的行为等。
static inline函数和static函数一样,其定义的范围是local的,即可以在程序内有多个同名的定义(只要不位于同一个文件内即可)。
 注意 
gcc的static inline的表现行为和C99标准的static inline是一致的。所以这种定义可以放心使用而没有兼容性问题。
要点:
gcc的static inline相对于static函数来说只是在调用时建议编译器进行内联展开;
gcc不会特意为static inline函数生成独立的汇编码,除非出现了必须生成不可的情况(如通过函数指针调用和递归调用);
gcc的static inline函数仅能作用于文件范围内。

1.2. inline

对于C99的inline来说,GCC的inline更容易理解:可以认为它是一个普通全局函数加上了inline的属性。即在其定义所在文件内,它的表
现和static
inline一致:在能展开的时候会被内联展开编译。但是为了能够在文件外调用它,gcc一定会为它生成一份独立的汇编码,以便在外部进行调用。即从文件
外部看来,它和一个普通的extern的函数无异。举个例子:
foo.c:
/* 这里定义了一个inline的函数foo() */
inline foo() {
    ...;   <- 编译器会像非inline函数一样为foo()生成独立的汇编码
}
void func1() {
    foo(); <- 同文件内foo()可能被编译器内联展开编译而不是直接call上面生成的汇编码
}
而在另一个文件里调用foo()的时候,则直接call的是上面文件内生成的汇编码:
bar.c:
extern foo(); <- 声明foo(),注意不能在声明内带inline关键字
void func2() {
    foo();    <- 这里就是直接call在foo.c内为foo()函数生成的汇编码了
}

要点:
gcc的inline函数相对于普通extern函数来说只是在同一个文件内调用时建议编译器进行内联展开;
gcc一定会为inline函数生成一份独立的汇编码,以便其在本文件之外被调用。在别的文件内看来,这个inline函数和普通的extern函数无异;
c的inline函数是全局性的:在文件内可以作为一个内联函数被内联展开,而在文件外可以调用它。

2、c++中的inline

在c++中,为了解决一些频繁调用的小函数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数。

要点:

inline的使用是有所限制的,inline只适合函数体内代码简单的函数使用,不能包含复杂的结构控制语句例如while switch,并且不能内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。

define的确也可以做到inline的这些工作,但是define是会产生副作用的,尤其是不同类型参数所导致的错误,由此可见inline有更强的约束性和能够让编译器检查出更多错误的特性,在c++中是不推荐使用define的。

  附:#define和inline的区别

1:宏define在预处理阶段完成;inline在编译阶段
2:类型安全检查
    inline函数是函数:要做类型检查;
3:替换方式
    define字符串替换;inline是指嵌入代码,在编译过程中不单独产生代码,在调用函数的地方不是跳转,而是把代码直接写到那里去,对于短小的函数比较实用,且安全可靠。  内联函数只是对编译器提出建议,是否进行替换,编译器有权拒绝。
时间: 2024-12-20 03:37:42

gcc标准,c++中的inline的相关文章

C++中的inline声明

C++中的inline声明 1. inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把函数指定为内联函数. inline int min(int first, int secend) { /****/ };   inline 函数对编译器而言必须是可见的,以便它能够在调用点(调用这个内联函数的位置)内展开该函数. 与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定 义.当然,对于同一程序的不同文件,如果in

C++中的inline的用法

C++中的inline的用法 参考:http://www.cnblogs.com/fnlingnzb-learner/p/6423917.html 1. 引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间. 在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导

标准C++中的string类的用法总结

标准C++中的string类的用法总结 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯定的.也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法.其实,可能很多人很可能会忽略掉标准C++中string类的使用.标准C++中提供的string类得功能也是非常强大的,一般都能满足我们开发项目时使用

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

标准动作中犯的错误,使用过程中忘记写结束符号所发生的错误

例如 错误写法: <jsp:getProperty property="userName" name="user" > 正确写法:<jsp:getProperty property="userName" name="user" /> 导致的异常: HTTP Status 500 - type Exception report message description The server encounte

标准C++中的string类的用法总结【转】

转自(略改动):http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 更全面新颖的说明见:http://www.cplusplus.com/reference/string/string/  说明: 1.size_t 是个unsigned integral type.  2.文中 c字符数组 是指末尾不带'\0'的,注意与 c字符串 的区别 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC

c/c++标准库中的文件操作总结

1 stdio.h是c标准库中的标准输入输出库 2 在c++中调用的方法 直接调用即可,但是最好在函数名前面加上::,以示区分类的内部函数和c标准库函数. 3 c标准输入输出库的使用 3.1 核心结构体 FILE结构体 打开一个文件的时候获取它,然后就可以不用管它了. 3.2 核心方法 3.2.1 fopen 第一个字符串是文件的路径. 第二个参数是一个字符串,表示操作该文件的模式,"rb"表示read binary,即以二进制的形式来读该文件. 3.2.2 fseek 第一个参数是F

为什么ASCII是7位(导致各家编码的128~256字符都不同,给我带来很多困惑)——在标准ASCII中,其最高位(b7)用作奇偶校验位,附ASCII每个控制符的中文解释

ASCII编码 ASCII是基于拉丁字母的一套电脑编码系统.它主要用于显示现代英语和其他西欧语言.它是现今最通用的单字节编码系统,并等同于国际标准ISO/IEC 646. 请注意,ASCII是American Standard Code for Information Interchange缩写,而不是ASC2,有很多人在这个地方产生误解. ASCII 码使用指定的7 位或8 位二进制数组合来表示128或256 种可能的字符.标准ASCII 码也叫基础ASCII码,使用7 位二进制数来表示所有的

[转]标准C++中的string类的用法总结

原文地址:http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html 相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用.但是如果离开了MFC框架,还有没有这样使用起来非常方便的类呢?答案是肯定的.也许有人会说,即使不用MFC框架,也可以想办法使用MFC中的API,具体的操作方法在本文最后给出操作方法.其实,可能很多人很可能会忽略掉标准C++中stri