C++继承C的一个重要特性是效率,在C中保护效率的一个方法是使用宏(macro),宏的实现是使用预处理器而不是编译器,预处理器直接用宏代码替换宏调用,所以就没有了参数压栈、生成汇编语言的CALL、返回参数、执行汇编语言的RETURN的时间花费,所有的工作由预处理器完成,因此不用花费什么就具有了程序调用的便利和可读性。

C++中使用预处理器宏存在两个问题,一是不安全性,二是C++特有的,预处理器不容许存取私有数据,这意味着预处理器在用作成员函数时变得非常无用。

为了既保持预处理器宏的效率又增加安全性,而且还能像一般的成员函数一样可以在类里访问自如,C++使用了内联函数。

内联函数与编译器

内联函数使用inline关键字定义,为了使之有效,必须使函数体和声明结合在一起,否则,编译器将它作为普通函数对待

一般应该把内联定义在头文件中,当编译器看到这个定义时,它把函数类型(函数名+返回值)和函数体放到符号表里,当使用函数时,编译器检查以确保调用和返回是否正确,然后将函数调用替换为函数体,因而消除了开销,内联代码的确占用空间,但假如函数较小,这实际比为了一个普通函数调用而产生的代码(参数压栈和执行CALL)占用的空间少。

1. 局限性

编译器在以下两种情况下不能处理内联:

(1) 函数体很大或很复杂,任何种类的循环都被认为太复杂,编译器遇到这种情况都会放弃内联方式,因为这时内联将可能不为我们提供任何效率

(2) 假如我们要显示或隐含地取函数地址,编译器也不能执行内联,因为这时编译器必须为函数代码分配内存从而为我们产生一个函数的地址。

我们必须理解内联仅仅是编译器的一个建议,编译器不强迫内联任何代码,一个好的编译器将会内联小的,简单的函数,同时明智的忽略那些太负责的内联

2. 赋值顺序

classforward

{public:

forward():i(0){}int f() const {return g() + 1;} // 注意int g() const {returni;}private:inti;

};voidmain()

{

forward F;

F.f();return;

}

观察上面的代码,虽然函数g()还没有定义,但在函数f()里对函数g()进行了调用,编译器会不会报错呢?

事实上这是可行的,因为语言定义规定非内联函数直到类声明结束才赋值。

假如一个内联函数对于一个还没有在内里面声明的函数进行向前引用,编译器就不会把它当做内联函数处理!

错误检查示例

inline void allege_error(int nVal, char *cMsg)

{if (!nVal)

{

fprintf(stderr, cMsg);

}

#ifdef NDEBUG

exit(1);#endif}#define allege(expr, msg)\{\

allege_error((expr? 1:0), msg);\

assert(expr);\

}#define allegemem(expr)\{\

allege(expr,"out of memory");\

}#define allegefile(expr)\{\

allege(expr,"could not open file\r\n");\

}voidmain()

{

ifstream nofile;

nofile.open("nofile.xxx", ios::in);

allegefile(nofile);return;

}

#define assert(_Expression) (void)( (!!(_Expression)) || (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

assert()宏中包含__FILE__和__LINE__

mysql 内联函数_C++之内联函数相关推荐

  1. java内联函数_Java之内联函数_内联函数的优缺点

    描述 内联函数 1.内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度. 2.Java语言中有一个关键字fina ...

  2. arg是什么函数_C 语言编程 — 函数

    函数 函数的本质就是针对变量的操作过程,同时可能也会改变当前程序的状态.它接受多个输入值,计算并返回一个输出值. 函数大体上分为 3 类: 主函数:每个 C 程序都至少有一个 main(). 内置函数 ...

  3. 没有varselect这个函数_C++的虚函数,虚析构函数,纯虚函数

    修改日期:2020/9/6 C++的虚函数 C++的虚函数的特点就是动态绑定,它的意思是动态绑定,在运行的时候,通过引用和指针,可以用基类的类,引用继承该c++类的派生类,虽然指针是基类,但实际上运行 ...

  4. java有没有友元函数_c++中友元函数理解与使用

    在学习c++这一块,关于友元函数和友元类,感觉还是不好理解,但是井下心来,理解,需要把我一下几点. 首先讲友元函数. (1)友元函数: 1)C++中引入友元函数,是为在该类中提供一个对外(除了他自己意 ...

  5. c语言timer linux 回调函数_C语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...

  6. c语言strchr函数内容,c strchr函数_c语言strchr函数_strchr函数用法

    各位看官们,大家好,上一回中咱们说的是字符串比较的例子,这一回咱们说的例子是:字符串查找.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,在C语言的标准库中为我们提供了字符串查找函数,我们 ...

  7. 外联样式表添加到html中,CSS联样式表之内联式、外联式和嵌入式

    CSS 全称级联样式表 (Cascading Style Sheets),在实际应用中,一般有以下三种级联方式. 1. 外联式 外联式样式表中,CSS 代码作为文件单独存放,如以 style.css ...

  8. swap函数_C++ vector成员函数实现[持续更新]

    此篇是 配合cppreference-zh-20200816.chm学习 <vector>, <stl_vector.h>和<vector.tcc>源码的笔记 环境 ...

  9. java实现c语言的函数_C语言tolower函数介绍、示例和实现

    C语言tolower函数用于把大写字母转换为小写字母. 在本文中,我们先来介绍tolower函数的使用方法,然后编写一个自定义的_tolower函数,实现与tolower函数相同的功能. 1.包含头文 ...

最新文章

  1. WINCE6.0更换桌面壁纸和图标
  2. 知识产权创业的比赛结果
  3. pycharm快敏捷键
  4. 端午前夕的班级小游戏
  5. STM32F103C8T6用官方bootloader实现IAP升级操作方法
  6. AC自动机 学习链接
  7. 程序员的自我修养笔记 2
  8. oracle 创建备份目录,Oracle rman创建和自动化备份
  9. apache2: unrecognized service
  10. 修改页面后获得flag_逆向基础题五:获取Flag
  11. 3台机器配置hadoop集群_复制Hadoop集群之后无法访问端口50070的问题
  12. SolidWorks2022 安装教程
  13. 如何计算离职率(1)?
  14. cnpm : 无法加载文件 C:\Users\小印丶\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。
  15. CSS3实现对话气泡效果
  16. 什么时候,董明珠能成功卖给记者一部格力手机?
  17. 【PCB叠层设计与阻抗计算】1.PCB板材介绍
  18. [Debug] 法语输入
  19. SFC模拟器coming soon
  20. 一文带你入门go语言

热门文章

  1. Java三种随机数生成方法
  2. python计算排队时间_Python(pdb)-排队执行命令
  3. 北信源管理网页卸载密码_Homebrew: 一行代码实现mac软件管理
  4. 共享文件原理_fishhook 的实现原理浅析
  5. berkeley db java edition 源码,Berkeley DB Java Edition
  6. python读取api接口频率_Python基础(API接口测试)
  7. html表格字体格式转换,【转】常用HTML代码速查表
  8. python docker_Docker实践:python应用容器化
  9. ORM是什么?如何理解ORM?
  10. 笔记41 Spring Web Flow——Demo