函数调用和inline作用
函数调用的开销:
函数被调用时,要有函数调用和返回。要保存当前程序上下文信息,以便函数调用完毕后返回原来的地方,继续执行程序。将函数的参数进行压栈、出栈,执行函数,函数调用完毕后释放内部变量占用的内存。
inline作用:
将函数声明为inline,是对编译器的一种建议,编译器可以选择不进行inline。大多数编译器是在编译过程中进行inline。所以不能对virtual函数进行inline,因为编译的时候编译器不知道该调用哪个函数。编译器也不对通过函数指针进行的调用实施inlining.
不要轻易的对构造函数和析构函数进行inline,因为即使看着函数体是空的,其实内部编译器会产生一些代码,比如添加默认构造函数,默认拷贝构造函数等等。
将函数声明为inline,编译器不把它当做是一个函数,而是类似于把函数代码拷贝到原来的地方,这样就省下了函数调用的开销。
将大多数inlining限制在小型、被频繁调用的函数上。内联函数会在每一处调用函数的地方进行代码复制,会使产生的代码膨胀,对于函数很大来说,这样获得的速度提高会很小甚至没有。所以对于递归,循环等不进行inline。
inline函数要将声明和定义放在一块,不然没有效果。在类内部的函数定义会自动扩展成inline。在类外部则需显式加上inline声明。
通常要将inline函数放在头文件内。
大部分调试器对inline函数束手无策,因为在一个不存在的函数内设立断点并不容易。
函数调用和inline作用的更多相关文章
- C++:inline
inline inline是C++提供的一个关键字,它用于函数定义之前,表示把函数定义为内联函数.内联函数的含义是:在函数调用点把函数体直接展开,取代函数调用. inline int getZero( ...
- C语言inline函数(转)
原文链接:http://blog.csdn.net/yuan1125/article/details/6225993 1 inline只是个编译器建议,编译器不一定非得展开Inline函数. 例如: ...
- 14.inline与namespace使用
#include <iostream> using namespace std; namespace all { //inline作用为默认调用 inline namespace V201 ...
- (转载)Autodesk面试技术题解答
Autodesk面试技术题解答 By SmartPtr(http://www.cppblog.com/SmartPtr/) 近一年以来,AUTODESK的面试题在网上是闹的沸沸扬扬, ...
- VC 宏与预处理使用方法总结
目录(?) C/C++ 预定义宏^ C/C++ 预定义宏用途:诊断与调试输出^ CRT 和 C 标准库中的宏^ NULL 空指针^ limits.h 整数类型常量^ float.h 浮点类型常量^ m ...
- OC 面试问题汇总
OC 问题汇总: 1. 你如何理解 iOS 内存管理 1. new alloc copy retain这些对象我们都要主动的release或者 autorelease 2. 如果是类方法创建的 ...
- 5.分析内核中断运行过程,以及中断3大结构体:irq_desc、irq_chip、irqaction
本节目标: 分析在linux中的中断是如何运行的,以及中断3大结构体:irq_desc.irq_chip.irqaction 在裸板程序中(参考stmdb和ldmia详解): 1.按键按下, 2 ...
- 【HTML5】HTML5新布局元素
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Python四步实现决策树ID3算法,参考机器学习实战
一.编写计算历史数据的经验熵函数 from math import log def calcShannonEnt(dataSet): numEntries = len(dataSet) labelCo ...
随机推荐
- 使用C#调用windows API入门
一:入门,直接从 C# 调用 DLL 导出 其实我们的议题应该叫做C#如何直接调用非托管代码,通常有2种方法: 1. 直接调用从 DLL 导出的函数. 2. 调用 COM 对象上的接口方法 我 ...
- 恶心的Oracle的if else if...
出处:http://blog.sina.com.cn/s/blog_407d47e60100d8ig.html 前段时间写Oracle存储过程就遇到问题.原来写成这样if 1=2 then null ...
- Messenger 弹窗的使用
关于Messenger 弹窗的文档及详细的说明请参考 Messenger官网,这时只介绍 Messenger 弹窗的使用 messenger依赖与jquery和Backbone.js,可以和 Bo ...
- python其中一个子线程,则退出全部线程,再退出进程
import threading, signal is_exit = False def write_login(self): global is_exit write_log('login rsyn ...
- 洛谷P1198 [JSOI2008]最大数
P1198 [JSOI2008]最大数 267通过 1.2K提交 题目提供者该用户不存在 标签线段树各省省选 难度提高+/省选- 提交该题 讨论 题解 记录 最新讨论 WA80的戳这QwQ BZOJ都 ...
- [前端 3]纯Js制作俄罗斯方块游戏
导读:在别人文章里看到了,然后写了一遍.结果出错了,然后调出来了,然后理解了一下,加了点注释,有一些想法.忘了在 哪一篇上面看的了,就贴不出来链接地址.原谅.呃,真没自己的东西,权当练打字了吧.其实, ...
- oracle split
select * from table(fun_strsplit('1,2,3,4,5')); 1.创建一个类型 ) 2.创建函数 CREATE OR REPLACE FUNCTION Fun_Str ...
- 免费在线CAD文件转换
AnyCAD Exchange Cloud 提供在线的CAD文件转换服务,包括二维图纸和三维模型的数据转换. 支持的格式有: DWG/DGN/DXF 到 PDF, SVG, DAE等的转换 STEP/ ...
- 逻辑回归的分布式实现 [Logistic Regression / Machine Learning / Spark ]
1- 问题提出 2- 逻辑回归 3- 理论推导 4- Python/Spark实现 # -*- coding: utf-8 -*- from pyspark import SparkContext f ...
- linux修改登陆后进入的默认目录
如将root登陆后进入的路径由/root改为/opt/FriendlyARM/linux/u-boot-mini6410修改/etc/pssswd 修改行 root:x:0:0:root:/root: ...