精华内容
下载资源
问答
  • inline函数

    2016-11-30 22:30:43
    inline函数是C++引入机制,目的是解决使用宏定义一些缺点。 1.为什么要引入内联函数(内联函数作用)  用它替代宏定义,消除宏定义缺点。宏定义使用预处理器实现,做一些简单字符替换因此不能进行参数...
    inline函数是C++引入的机制,目的是解决使用宏定义的一些缺点。
    1.为什么要引入内联函数(内联函数的作用)
      用它替代宏定义,消除宏定义的缺点。宏定义使用预处理器实现,做一些简单的字符替换因此不能进行参数有效性的检测。另外它的返回值不能被强制转换为可转换的合适类型,且C++中引入了类及类的访问控制,在涉及到类的保护成员和私有成员就不能用宏定义来操作。
    2.inline相比宏定义有哪些优越处
      (1)inline函数代码是被放到符号表中,使用时像宏一样展开,没有调用的开销效率很高;
      (2)inline函数是真正的函数,所以要进行一系列的数据类型检查;
      (3)inline函数作为类的成员函数,可以使用类的保护成员及私有成员;
    3.inline函数使用的场合
      (1)使用宏定义的地方都可以使用inline函数;
      (2)作为类成员接口函数来读写类的私有成员或者保护成员;
    4.为什么不能把所有的函数写成inline函数
      内联函数以代码复杂为代价,它以省去函数调用的开销来提高执行效率。所以一方面如果内联函数体内代码执行时间相比函数调用开销较大没有太大的意义;另一方面每一处内联函数的调用都要复制代码,消耗更多的内存空间,因此以下情况不宜使用内联函数。
      (1)函数体内的代码比较长,将导致内存消耗代价;
      (2)函数体内有循环,函数执行时间要比函数调用开销大;
      另外类的构造与析构函数不要写成内联函数。
    5.内联函数与宏定义区别
      (1)内联函数在编译时展开,宏在预编译时展开;
      (2)内联函数直接嵌入到目标代码中,宏是简单的做文本替换;
      (3)内联函数有类型检测、语法判断等功能,而宏没有;
      (4)inline函数是函数,宏不是;
      (5)宏定义时要注意书写(参数要括起来)否则容易出现歧义,内联函数不会产生歧义;
    展开全文
  • 成员函数(简称类函数)是函数的一种,它用法和作用和前面介绍过的函数基本上是一样,它也有返回值函数类型,它与一般函数的区别只是:它是属于一个类成员,出现在类体中。它可以被指定为private(私有...

    作者原文:https://www.cnblogs.com/wuchanming/p/4061654.html

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中。它可以被指定为private(私有的)、public (公用的)或protected(受保护的)。

    在使用类函数时,要注意调用它的权限(它能否被调用)以及它的作用域(函数能使用什么范围中的数据和函数)。例如私有的成员函数只能被本类中的其它成员函数所调用,而不能被类外调用。成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据。

    一般的做法是将需要被外界调用的成员函数指定为public,它们是类的对外接口。但应注意,并非要求把所有成员函数都指定为public。有的函数并不是准备为外界调用的,而是为本类中的成员函数所调用的,就应该将它们指定为private。这种函数的作用是支持其它函数的操作,是类中其它成员的工具函数(utility function),类外用户不能调用这些私有的工具函数。

    类的成员函数是类体中十分重要的部分。如果一个类中不包含成员函数,就等同于C语言中的结构体了,体现不出类在面向对象程序设计中的作用。

    在类外定义成员函数

    在前面已经看到成员函数是在类体中定义的。也可以在类体中只写成员函数的声明,而在类的外面进行函数定义。如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    class Student

    {

    public :

    void display( ); //公用成员函数原型声明

    private :

    int num;

    string name;

    char sex;

    //以上3行是私有数据成员

    };

    void Student::display( )//在类外定义display类函数

    {

    cout<<"num:"<<num<<endl;

    cout<<"name:"<<name<<endl;

    cout<<"sex:"<<sex<<endl;

    }

    Student stud1,stud2; //定义两个类对象

    注意:在类体中直接定义函数时,不需要在函数名前面加上类名,因为函数属于哪一个类是不言而喻的

    但成员函数在类外定义时,必须在函数名前面加上类名,予以限定(qualifed)," :: "是作用域限定符(field qualifier)或称作用域运算符,用它声明函数是属于哪个类的。

    如果在作用域运算符“::”的前面没有类名,或者函数名前面既无类名又无作用域运算符“::”,如
        ::display( ) 或 display( )
    则表示display函数不属于任何类,这个函数不是成员函数,而是全局函数,即非成员函数的一般普通函数。

    类函数必须先在类体中作原型声明,然后在类外定义,也就是说类体的位置应在函数定义之前,否则编译时会出错。

    虽然函数在类的外部定义,但在调用成员函数时会根据在类中声明的函数原型找到函数的定义(函数代码),从而执行该函数。

    在类的内部对成员函数作声明,而在类体外定义成员函数,这是程序设计的一种良好习惯。如果一个函数,其函数体只有2-3行,一般可在声明类时在类体中定义。多于3行的函数,一般在类体内声明,在类外定义。

    inline 成员函数

    关于内置(inline )函数,在前边已经作过介绍,请猛击:C++内置函数。类的成员函数也可以指定为内置函数。

    在类体中定义的成员函数的规模一般都很小,而系统调用函数的过程所花费的时间开销相对是比较大的。调用一个函数的时间开销远远大于小规模函数体中全部语句的执行时间。为了减少时间开销,如果在类体中定义的成员函数中不包括循环等控制结构,C++系统会自动将它们作为内置(inline)函数来处理。

    也就是说,在程序调用这些成员函数时,并不是真正地执行函数的调用过程(如保留返回地址等处理),而是把函数代码嵌入程序的调用点。这样可以大大减少调用成员函数的时间开销。C++要求对一般的内置函数要用关键字inline声明,但对类内定义的成员函数,可以省略inline,因为这些成员函数已被隐含地指定为内置函数。如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    class Student

    {

    public :

    void display( )

    {

    cout<<"num:"<<num<<endl;cout<<"name:"

    <<name<<endl;cout<<"sex:"<<sex<<endl;

    }

    private :

    int num;

    string name;

    char sex;

    };

    其中第3行
        void display( )
    也可以写成
        inline void display( )
    将display函数显式地声明为内置函数。

    以上两种写法是等效的。对在类体内定义的函数,一般都省写inline。

    应该注意的是,如果成员函数不在类体内定义,而在类体外定义,系统并不把它默认为内置(inline )函数,调用这些成员函数的过程和调用一般函数的过程是相同的。如果想将这些成员函数指定为内置函数,应当用inline作显式声明。如:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    class Student

    {

    public inline void display( );//声明此成员函数为内置函数

    private :

    int num;

    string name;

    char sex;

    };

    inline void Student::display( ) // 在类外定义display函数为内置函数

    {

    cout<<"num:"<<num<<endl;cout<<"name:"<<name<<endl;cout<<"sex:"<<sex<<endl;

    }

    在前面曾提到过,在函数的声明或函数的定义两者之一作inline声明即可。值得注意的是,如果在类体外定义inline函数,则必须将类定义和成员函数的定义都放在同一个头文件中(或者写在同一个源文件中),否则编译时无法进行置换(将函数代码的拷贝嵌入到函数调用点)。但是这样做,不利于类的接口与类的实现分离,不利于信息隐蔽。虽然程序的执行效率提高了,但从软件工程质量的角度来看,这样做并不是好的办法。只有在类外定义的成员函数规模很小而调用频率较高时,才将此成员函数指定为内置函数。

    展开全文
  • 函数重载(Overload) 规则 函数名相同 参数个数不同、参数类型不同、参数顺序不同 注意 返回值类型与函数重载无关 ...重载时会生成多个不同的函数名,不同编译器(MSVC、g++)不同生成规...

    函数重载(Overload)

    • 规则
      • 函数名相同
      • 参数个数不同、参数类型不同、参数顺序不同
    • 注意
      • 返回值类型与函数重载无关
      • 调用函数时,实参的隐式类型转换可能会产生二义性
    • 本质
      • 采用了name mangling 或者 name decoration
      • C++编译器默认会对符号名(比如函数名)进行改编、修饰
      • 重载时会生成多个不同的函数名,不同编译器(MSVC、g++)有不同的生成规则
      • 通过IDA打开【VS_Release——禁止优化】可以看到

    示例:以下构成函数重载

    • 参数个数不同

      int sum(int a, int b){
          return a + b;
      }
      int sum(int a, int b, int c){
          return a + b + c;
      }
    • 参数类型不同

      int sum(int a, int b){
          return a + b;
      }
      double sum(double a, double b){
          return a + b;
      }
    • 参数顺序不同

      void display(int a, double b){
          cout << "int a = " << a << "double b = " << b << endl;
      }
      void display(double a, int b){
          cout << "double a = " << a << "int b = " << b << endl;
      }

    示例:以下不构成函数重载

    • 返回值类型不同,不构成重载

      int sum(int a){
          return a + 1;
      }
      void sum(int a){
          cout << "void sum(int a) " << endl;
      }
    • 实参的隐式转换,产生二义性

      void display(long a){
          cout << " void display(long a) " << endl;
      }
      void display(double a){
          cout << " void display(double a) " << endl;
      }

    默认参数

    • C++允许函数设置默认参数,在调用时可以根据情况省略实参。规则如下:
      • 默认参数只能按照右到左的顺序
      • 如果函数同时有声明、实现,默认参数只能放在函数声明中
      • 默认参数的值可以是常量、全局符号(全局变量、函数名)
      int age = 33;
      void test(){
          cout << " test() " << endl;
      }
      void display(int a = 11, int b = 22, int c = age, void(*func)() = test) {
          cout << "a = " << a << endl;
          cout << "b = " << b << endl;
          cout << "c = " << c << endl;
          func();
      }

    函数重载与默认参数可能会产生二义性(建议优先选择使用默认参数)

    • void display(int a, int b = 20){
          cout << "a = " << a << endl;
      }
      void display(int a){
          cout << "a = " << a << endl;
      }

    内联函数(inline function)

    • 使用inline修饰函数的声明或者实现,可以使其变成内联函数
    • 建议声明和实现都加inline修饰

    • 特点
      • 编译器会将函数调用直接展开为函数体代码
      • 可以减少函数调用的开销
      • 会增大代码体积
    • 注意
      • 尽量不要内联超过10行代码的函数
      • 有些函数即使声明为inline,也不一定会被编译器内联,比如递归函数
    • VS 可以在Release模式下禁止编译器内联行为:右击sln --> 属性 --> 配置属性 --> C/C++ --> 优化 --> 优化(已禁用(/Od))

    内联函数与宏的比较

    • 都可以减少函数调用的开销
    • 对比宏,内联函数多了语法检测和函数特性

    转载于:https://www.cnblogs.com/tzsh1007/p/11254172.html

    展开全文
  • Debug模式效率比Release低是众所周知,但有时候两者差别十分之大。   一个原因是Debug模式下默认不会对函数...而如果函数有返回值且返回是一个需要构造变量,则会在返回时调用构造函数进一步降低效率。

    Debug模式效率比Release低是众所周知的,但有时候两者的差别十分之大。

     

    一个原因是Debug模式下默认不会对函数进行内联(即使你使用了inline关键字!),不内联的函数在调用时先压栈保护现场、抬高栈顶分配临时变量、执行函数体、释放临时变量、恢复现场、检查栈平衡等一系列操作,占用大量时间。而如果函数有返回值且返回的是一个需要构造的变量,则会在返回时调用构造函数进一步的降低效率。

     

    我的测试中对30000个面片进行绘制,其中面片的绘制用到了许多内联函数(每次绘制大约六个),在Release模式下帧率轻松达到60帧每秒(与我屏幕的刷新频率相同),而Debug模式下仅能达3、4帧每秒!可见影响十分明显,所以程序效率低很有可能是编译器的优化问题,一般情况下Release模式的选项能达到不错的优化,显著的提高性能。

    展开全文
  • inline函数是C++引入机制,目的是解决使用宏定义一些缺点。 1.为什么要引入内联函数(内联函数作用) 用它替代宏定义,消除宏定义缺点。宏定义使用预处理器实现,做一些简单字符替换,因此不能进行参数...
  • 顾名思义,就是函数返回值为指向数组/函数的指针。 数组性质:不能被拷贝,函数也不能返回数组。但可以返回数组指针/引用,声明一个返回数组指针的函数四种方式,一种是直接声明,格式为: int (*func...
  • 成员函数(简称类函数)是函数的一种,它用法和作用和前面介绍过的函数基本上是一样,它也有返回值函数类型,它与一般函数的区别只是:它是属于一个类成员,出现在类体中。它可以被指定为private(私有...
  • 使用函数的好处想必大家都了解,但是调用函数会增加许多开销,栈和寄存器操作。对于那些函数体比较简洁、被调用又特别频繁的函数来说。这些开销对性能影响还是比较大。因此,就产生了内联函数来解决这个问题...
  • inline-内联函数

    2017-09-13 13:59:19
    内联函数与预处理宏相同之处,在每一处调用内联函数的地方,编译器将展开内联函数,将代码直接嵌入到调用处,从而节省了函数调用、参数入栈和返回值的处理。内联函数是使用频繁调用、代码行数很短的小函数,且代码...
  •   就是使用了关键字inline的函数,如 inline int max(int a, int b) { return a > b ? a : b; } 2. 内联函数有什么作用?   C++在调用函数时,会执行一系列操作: 将参数push到堆栈中 将返回地址push到...
  •   就是使用了关键字inline的函数,如inlineintmax(inta,intb){returna>b?a:b;}2. 内联函数有什么作用?  C++在调用函数时,会执行一系列操作:将参数push到堆栈中将返回地址push到堆栈中准备返回值将所有...
  • 然后跳到标记函数起点内存单元当中,执行函数代码,将返回值放回到寄存器当中; c.跳回到地址被保存指令处 为了能够对这个执行过程更加明确理解,我在这里举个例子: 比如我们在看一篇文章时候,个...
  • 以下是基于 linux 0.11 内核说明。 在init/main.c第138行, 在move_to_user_mode()之后,进程0通过fork()产生子进程,实际就是进程1(init进程)。 在main.c第23行: ...static inline _syscall...
  • 内联函数inline

    2018-05-28 14:35:41
     C语言或者C++中,在调用函数的时候,都会将函数的参数、内部变量、返回值都会用栈来保存,如果一个函数反复频繁被调用,那么这个压栈出栈过程就会被重复调用,而压栈出栈都是会耗费时间,所以出现了内联函数...
  • 13_细谈内联函数inline

    2020-04-15 22:54:29
    1、宏函数(带参数宏)缺点: 第一:在c中也会出现,宏看起来...内联函数:内联函数为了继承宏函数的效率,没有函数调用时开销,然后又可以像普通函数那样,可以进行参数,返回值类型安全检查,又可以作为成...
  • 以值作为参数或者返回值类型, 在传参和返回期间, 函数不会直接传递实参或者将变量本身直接返回, 而是传递实参或者返回变量一份临时拷贝, 因此用值作为参数或者返回值类型, 效率是十分低下, 尤其是当参数或者...
  • 函数在c++中区别

    2017-05-08 15:15:27
    c和c++的有inline c在c99中添加了inline函数 但是inline函数 作用 更安全宏 在调用点展开 没有栈针会退 一些函数不能采用inline 如递归对次数 未知或者可变参对于参数个数未知 函数重载条 函数名相同 参数类型...
  • 使用inline关键字修饰的函数 内联函数作用:解决函数调用效率问题 使用场合:频繁调用、代码简单的函数 优势 内联函数PK函数:在调用处直接展开,省去了调用开销 内联函数PK宏:参数传递、参数检查、返回值 关键字:...
  • inline与宏区别

    2009-11-04 19:15:00
    自己总结一下,虽然会不太全面, inline:编译时不生成独立代码,而是嵌入到函数调用处,安全类型检查,可以进行调试。和一般函数相比,无返回值,而且函数体不能循环、switch语句,但是比一般函数调用省去了...
  • 重载时会生成多个不同的函数名,不同编译器(MSVC,g++)不同生成规则 Debug模式:很多调试信息,生成可执行文件比较臃肿 Release模式:去除调试信息,生成可执行文件比较精简 高效 #include<iostrea....
  • 成员函数及重载

    千次阅读 2018-03-17 22:12:39
    成员函数必须在类体内给出...在类外定义成员函数时,函数名应该包括:类名 + 作用域符(::)+ 原函数名在类体内定义成员函数默认为内联,而要在类体外定义内联成员函数,则需在函数返回值前加上关键字inline。...
  • 构造函数——用于初始化对象函数名与类名相同,不能有返回值类型,可以有形式参数,也可以没有形式参数,可以是inline函数,可以重载,可以带默认参数值。在对象创建时自动调用。如: Clock myClock(0,0,0);默认构造...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 214
精华内容 85
关键字:

有返回值的inline函数