内联函数

java final方法与java内联函数

匿名 (未验证) 提交于 2019-12-02 21:53:52
二、效率。在java早期实现中,如果将一个方法指明为final,就是同意编译器将针对该方法的调用都转化为内嵌调用。….. 大概就是,如果是内嵌调用,虚拟机不再执行正常的方法调用(参数压栈,跳转到方法处执行,再调回,处理栈参数,处理返回值),而是直接将方法展开,以方法体重的实际代码替代原来的方法调用。这样减少了方法调用的开销。当然如果一个方法体本身就很大,这样的优势就小了很多了。 引用:函数/方法调用过程中CPU要进行现场处理(不妨看做是一种中断),当前的变量状态、寄存器状态、程序计数器PC。。。都要一一入栈保护起来,调用返回时又要一一出栈恢复以继续执行。相对于顺序执行流程,函数调用的入栈出栈带来了额外的开销,效率没有顺序执行高。 在最近的java设计中,虚拟机(特别是hotspot技术)可以自己去根据具体情况自动优化选择是否进行内联,因此和final关键字就无关了。 内联函数 在计算机科学中,内联函数(有时称作在线函数或编译时期展开函数)是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。 但在选择使用内联函数时,必须在程序占用空间和程序执行效率之间进行权衡,因为过多的比较复杂的函数进行内联扩展将带来很大的存储资源开支

Java的内联函数

匿名 (未验证) 提交于 2019-12-02 21:40:30
版权声明:转载请附上本文连接地址 https://blog.csdn.net/weixin_44018338/article/details/91458013 “所谓内联函数就是指函数在被调用的地方直接展开,编译器在调用时不用像一般函数那样,参数压栈,返回时参数出栈以及资源释放等,这样提高了程序执行速度。 对应Java语言中也有一个关键字final来指明那个函数是内联的。 内联不一定好,当被指定为内联的方法体很大时,展开的开销可能就已经超过了普通函数调用调用的时间,引入了内联反而降低了性能,因为在选择这个关键字应该慎重些,不过,在以后高版本的JVM中,在处理内联时做出了优化,它会根据方法的规模来确定是否展开调用。” 内联函数特点: (1)提升效率。如上说明。 (2)占更多内存空间。编译器直接将内联函数扩展开,调用多复制品就多,因此更占用内存。 (3)java中不需额外关注,jvm会自动进行优化 内联举例: int max (int a, int b){ if (a > b) return a; else return b; } void main() { ..... a = max (x, y); // 内联,等价于 "a = (x > y ? x : y);" 直接扩展开了,不再调用方法 ..... } 内联函数的含义就是对函数(方法)进行某种处理,在程序运行的时候将函数(方法

C语言预处理理论-宏定义2

和自甴很熟 提交于 2019-12-02 08:10:31
宏定义2 1、带参宏和带参函数的区别 (1)宏定义是在预处理期间处理的,而函数是在编译期间处理的。这个区别带来的实质差异是:宏定义最终是在调用宏的 地方把宏体原地展开,而函数是在调用函数处跳转到函数中去执行,执行完后再跳转回来。 注:宏定义和函数最大差别就是:宏定义是原地展开,因此没有调用开销;而函数是跳转执行再返回,因此函数有比较大 的调用开销。所以宏定义和函数相比,优势就是没有调用开销,没有传参开销,所以当函数体很短(尤其是只有一句话) 可以用宏定义来替代,这样效率高。 (2)带参宏和带参函数的一个重要差别就是:宏定义不会检查参数的类型,返回值也不会附带类型;而函数有明确的参数类型 和返回值类型。当我们调用函数时编译器会帮我们做参数的静态类型检查,如果编译器发现我们实际传参和参数声明不一样时就会 报错或者报警告。 注:用函数的时候程序员不太用操心类型不匹配,因为编译器会检查,如果不匹配编译器会有提示;用宏的时候程序员必须很注意 实际传参和宏所希望的参数类型一致,否则可能编译不报错,但是运行有误。 总结:宏和函数各有千秋,各有优劣。总的来说,如果代码比较多用函数适合而且不影响效率;但是对于那些只有一两句话的函数开销 就太大了,适合用带参宏。但是用带参宏又有缺点:不检查参数类型。 2、内联函数和inline关键字 (1)内联函数通过在函数定义前加incline关键字实现。 (2

Chapter03 第一节 简单变量

混江龙づ霸主 提交于 2019-12-02 04:54:17
3.1 简单变量 定义一个变量后,系统根据变量类型的不同在内存的不同区域分配一个空间,将值复制到内存中,然后用户通过变量名访问这个空间。 3.1.1 变量名 变量名的命名规则: 只能使用字母、数字、下划线 第一个字符不能是数字 区分大小写 不能使用关键字 以两个下划线/下划线和大学字符开头的名称保留给实现使用,以一个下划线开头的名称保留给实现,用作全局标识符(c++程序的所有源文件可用) 部分环境对变量名长度有要求 3.1.2 & 3.1.3 整型以及其扩展 计算机的基本单位是bit(位),一个bit分为0/1两种状态,8bit能表示256种不同的状态。一个字节通常意义上由8bit组成。1KB=1024字节。 int、short、long、long long 都表示整型,但是他们的位数不同,所以表示的数值的范围也就不同。不同的类型规定了不同的最小长度。具体如下: Short 16位 int 16位 long 32位 long long 64位 cppreference详细说明 不同位数的系统中,整型的长度不一样。主要区别在于long类型和指针类型。16位机器中,long占4字节,不支持longlong类型,指针为2个字节。32位机器中,long占4字节,longlong占8个字节,指针占4个字节。64位系统中,long占8个字节,longlong8个字节,指针8个字节。 //

C++中头文件与源文件的作用详解

一世执手 提交于 2019-12-01 21:11:43
一、C++ 编译模式 通常,在一个 C++ 程序中,只包含两类文件―― .cpp 文件和 .h 文件。其中,.cpp 文件被称作 C++ 源文件,里面放的都是 C++ 的源代码;而 .h 文件则被称作 C++ 头文件,里面放的也是 C++ 的源代码。 C++ 语言支持"分别编译"(separatecompilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的 .cpp 文件里。.cpp 文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。比如,在文件 a.cpp 中定义了一个全局函数 "void a(){}",而在文件 b.cpp 中需要调用这个函数。即使这样,文件 a.cpp 和文件 b.cpp 并不需要相互知道对方的存在,而是可以分别地对它们进行编译,编译成目标文件之后再链接,整个程序就可以运行了。 这是怎么实现的呢?从写程序的角度来讲,很简单。在文件 b.cpp 中,在调用 "void a()" 函数之前,先声明一下这个函数 "voida();",就可以了。这是因为编译器在编译 b.cpp 的时候会生成一个符号表(symbol table),像 "void a()" 这样的看不到定义的符号,就会被存放在这个表中。再进行链接的时候

内联函数_引用_默认参数_模版_函数重载

梦想的初衷 提交于 2019-12-01 10:22:24
1:内联函数 普通函数是直接到函数内存地址去执行,但是内联函数是把函数拷贝一份到main函数里面,不要再去指定位置查找了。 函数代码执行时间很短,调用时间相对长此时用内联。但当代码执行时间长,将函数调入到内存里面的成本大于函数调用的时间此时不建议使用内联函数。 内联函数一般要比普通函数效率高,缺点是内存消耗大。 但一般在函数定义上加内联 关于内联的知识可以参考这篇博客 1 #include <bits/stdc++.h> 2 using namespace std; 3 inline int S(int num) 4 { 5 return num * num; 6 } 7 #define S1(num) num * num//以后在所有使用S(num)的地方,被自动替换为 num * num 8 int main() 9 { 10 cout << S(5) << endl;//25 11 cout << S(5+10) << endl;//225 12 cout << S1(5) << endl;//25 13 cout << S1(5+10) << endl;//65 14 //很明显,最后一个宏定义的结果出错,他的计算思路是5+10*5+10,所以c++推荐使用内联,不推荐使用宏定义 15 return 0; 16 } 2:引用 const int& refValue = 12

尽量使用内联函数替代宏函数

前提是你 提交于 2019-12-01 07:26:01
  宏函数看起来像函数,却不会带来函数调用的额外开销,但是宏函数也有其弊端,例如:   #define CALL_MAX_FUN(a, b) fun((a) > (b) ? (a) : (b))   int a = 5, b=0;   CALL_MAX_FUN(++a, b); //a自增2次   CALL_MAX_FUN(++a, b+10); //a自增1次   同样的调用,竟然会因为参数的不同,导致a的结果值不同。      所以尽量使用内联函数来替代宏,内联函数由于其内链接的属性,可以在头文件中定义,并且被多个编译单元引用。另外内联函数也不会带来函数调用的额外开销。另外内联函数是真正的函数,它遵守作用域和访问规则。   template<typename T>   inline void CallMaxFun(const T& a, const T& b)   {     f( a > b ? a : b);   } 来源: https://www.cnblogs.com/fangyan5218/p/11668707.html

匿名函数,子函数,私有函数,重载函数,eval和feval函数

徘徊边缘 提交于 2019-11-30 09:54:08
匿名函数,子函数,私有函数等函数类型 匿名函数: 匿名函数没有函数名,也不是.m文件,只包含一个表达式和输入输出参数。 Fxy=@(x,y)x.^y+3*x*y x,y为输入输入参数,Fxy为函数名 子函数: 在 Matlab中, 多个函数写入一个.m文件中。其中出现的第一个函数称为主函数,其他函数称为子函数,保存时文件名与主函数名相同,外部程序只能调用主函数。 特点: 子函数只能被同一文件下的其他函数调用 通过名称调用函数时优先调用子函数,再调用内置函数。 同一文件的主函数,子函数工作区独立,各个函数之间的信息传递通过输入输出参数实现。 Help,lookfor无法显示子函数的相关信息 function F=ex4_19(n) A=1; w=2; phi=pi/2; signal=createsig(A,w,phi); F=signal.^n; %%%%%%%%subfunction%%%%%%%%%% function signal=createsig(A,w,phi) x=0:pi/100:pi*2; signal=A*sin(w*x+phi); 私有函数和私有目录: 私有函数指位于私有目录private下的函数文件。 特点: 私有函数构造与普通函数相同。 私有函数只能被private目录下的M文件直接调用。 使用指令调用私有函数,优先级仅次于Matlab内置函数和子函数

第三章(函数)

百般思念 提交于 2019-11-29 17:22:20
C++要求,所有函数必须先声明,后使用 调用其他函数的函数称为主调函数,被其他函数调用的函数称为被调函数。 形参的作用是实现主调函数与被调函数之间的联系。 main函数也可以有参数,称为命令行参数,由操作系统启动程序时初始化。 return可以结束当前函数的执行,但是函数的结束为汇编语言ret 如果希望在定义一个函数前调用它,则需要在调用函数之前添加该函数的函数原型声明。 声明函数时,形参名可以省略(不推荐)。 递归调用:函数可以直接或间接地调用自身,称为递归调用。(只有有限的递归调用才有意义) 函数在未被调用时,函数的形参不占内存空间,也没有实际的值。 形参和实参结合的方式有两种:值传递和引用传递。 值传递:函数调用时,给形参分配内存空间,使用实参初始化形参,之后形参实参脱离联系。 引用传递:引用是一种特殊类型的变量,是其他变量的别名。 声明一个引用时,必须对它进行初始化,使它指向一个已经存在的对象。且一旦初始化后,就不能指向其他对象。 内联函数不是在调用时发生控制转移,而是在编译时将函数体潜入每一个调用处。节省参数传递,控制转移等开销,适用于规模小但是调用频繁的函数。如果将复杂函数定义为内联函数,会造成代码膨胀,增大开销。所以现代编译器多会自主判断是否将一个函数转换为内联函数。还存在一些函数无法作为内联函数,比如自身递归函数不可作为内联函数。 inline 类型说明符 函数名

内联函数

こ雲淡風輕ζ 提交于 2019-11-29 16:49:51
什么是内联函数? 内联函数是C++的增强特性之一,用来降低程序的运行时间。当内联函数收到编译器的指示时,即可发生内联:编译器将使用函数的定义体来替代函数调用语句,这种替代行为发生在编译阶段而非程序运行阶段。内联函数作为编译器优化手段的一种技术,在降低运行时间上非常有用。 内联函数在什么时候使用? 在程序中,函数被调用的同时也会降低程序的执行效率,增加空间和时间上的开销。因此,对于一些功能简单、规模较小有使用频繁的函数,可以设计为 内联函数 。 内联函数的定义方式: 与普通函数不同的是,定义此函数需要使用关键字 inline ,语法如下: Inline 类型说明符 函数名(含类型说明的形参表) { 语句序列 } 下面我们将通过一个例子来进一步认识内联函数: #include using namespace std; const double PI = 3.14159265358979; //内联函数,根据圆的半径计算其面积 inline double calArea(double radius) { return PI radius radius; } int main() { double r=3.0; //r是圆的半径 //调用内联函数求圆的面积,编译时此处被替换为calArea函数体语句 double area=calArea(r); cout<<area<<endl;