我一直在试图理解真正的含义:
内联函数
在C
++中,是在类声明中定义的成员函数。(2)编译器用该函数的实际代码替换的函数调用。关键字inline可用于提示编译器对成员或非成员函数的主体执行内联扩展。排队
在编译过程中用函数代码的副本替换函数调用。
例如,它写成类似:
当方法为最终方法时,可以内联。
此处:http :
//www.roseindia.net/javatutorials/final_methods.shtml
您能给我一个例子还是什么,或者基本上可以帮助我理解“可能内联”的意思。
谢谢。
内联是Java即时编译器执行的优化。
如果有方法:
public int addPlusOne(int a, int b) {
return a + b + 1;
}
您这样称呼:
public void testAddPlusOne() {
int v1 = addPlusOne(2, 5);
int v2 = addPlusOne(7, 13);
// do something with v1, v2
}
编译器可能会决定将您的函数调用替换为函数主体,因此结果实际上将如下所示:
public void testAddPlusOne() {
int v1 = 2 + 5 + 1;
int v2 = 7 + 13 + 1
// do something with v1, v2
}
编译器这样做是为了节省实际进行函数调用的开销,这将涉及将每个参数压入堆栈。
显然,只能对非虚拟功能执行此操作。考虑一下如果子类中重写了该方法并且直到运行时才知道包含该方法的对象的类型会发生什么…编译器将如何知道要复制的代码:基类的方法主体或子类的方法体?由于在Java中默认情况下所有方法都是虚拟的,因此您可以显式标记那些无法覆盖的方法final
(或将它们放入final
类中)。这将有助于编译器确定该方法永远不会被覆盖,并且可以安全地内联。(请注意,编译器有时也可以针对非最终方法做出此确定。)
另外,请注意引号中的单词“ 可能 ”。最终方法不能保证是内联的。您可以通过多种方法来保证方法无法内联,但是无法 强制
编译器内联。无论如何,内联将有助于或不利于所产生的代码的速度,几乎总是比您了解的更多。
有关收益和问题的完整概述,请参见Wikipedia。
我最近看到我的朋友编写的一个 类有很多方法。该类与图像有关,并且具有诸如 我问他为什么要使用。我知道编译器会更改 到 他只是说,它减少了对函数的调用,并且只在实用程序方法上使用它们。每次复制相同的代码不会增加程序大小吗? 现在需要这个吗?如果需要,应该在什么时候使用它们? 编辑 我在Patrick提供的一个列表中列出了大多数问题和优点,以帮助那些不想浏览链接的未来观众。 问题 用扩展的函数体替换调
问题内容: 我指的是这种讨论。我从未用C或C++编写任何代码。我没有任何CS背景。但是,我从事Java开发人员已有5年了,现在我决定学习更多有关CS的知识,并进行一些后续工作。 问题答案: 在执行给定的代码段时,无论何时调用标准函数,执行时间都比将其中包含的代码转储到该函数中略高。每当在函数中包含的整个代码都无法维护时,就进行转储,因为这显然会导致整个代码重复。 内联 通过让您将函数声明为 内联(
问题内容: 如果String对象是不可变的(因此显然不能改变其长度),为什么要使用方法而不是简单地像数组中那样呢? 它仅仅是一个getter方法,还是进行某种计算? 只是想看看背后的逻辑。 问题答案: Java是一种标准,而不仅仅是一种实现。只要遵守标准,不同的供应商就可以以不同的方式许可和实现Java。通过对字段进行标准调用,这毫无理由地严重限制了实现。 而且,就类的未来而言,方法要灵活得多。除
问题内容: 我下面有这个简单的程序 请注意,我使用的是值,而不是指针。但是sync包的页面指定,和函数采用。 为什么/如何运作? 问题答案: 的设定方法的是空的方法集: 输出(在Go Playground上尝试): 这是因为所有方法都具有指针接收器,因此它们都是该类型的方法集的一部分。 当您这样做时: 这实际上是的简写,等等。 这是在规范中:致电: 如果是可寻址且方法集包含,则为的简写。 因此,当
本文向大家介绍什么是JavaScript apply()方法?,包括了什么是JavaScript apply()方法?的使用技巧和注意事项,需要的朋友参考一下 javascript 方法与相同,但是将函数参数视为数组。您可以尝试运行以下代码,了解如何在JavaScript中实现方法- 示例 输出结果