内联是什么?

我指的是这个讨论 。 我从未在C或C ++中编写任何代码。 我没有任何CS背景。 但是我作为Java开发人员已经工作了5年,现在我已经决定了解更多有关CS的知识并做一些追赶。

当执行给定的代码时,无论何时调用标准函数,执行时间都略高于转储包含在该函数中的代码。 每次函数中包含的整个代码在另一端都是不可维护的时候倾倒,因为它显然会导致代码重复的混乱。

内联通过让您将函数声明为内联 (至少在C ++中)来解决性能和可维护性问题,这样当您调用该函数时 – 而不是让您的应用程序在运行时跳转 – 内联函数中的代码将在编译时注入每次调用给定函数时的时间。

这样做的缺点是 – 如果你内联大量的函数,你会调用很多次 – 程序的大小可能会大大增加( 最佳实践建议只在小函数上执行)。

http://en.wikipedia.org/wiki/Inlining

在计算,内联扩展或内联中,是一种编译器优化,它将函数调用站点替换为被调用者的主体。 这种优化可以在运行时改善时间和空间使用,可能增加最终程序的大小。

作为Java开发人员,您通常不必担心方法内联。 Java的Just-in-time编译器可以并且将在大多数有意义的地方自动执行。

像eclipse这样的IDE可以有一个function,允许你在源代码级别内联方法 – 永远不要为了性能,只为了代码可读性(例如当你意识到方法只是调用另一个方法而不添加任何有用的东西)。

正如其他答案中已经提到的,内联带来了成本。 通常这被认为是小的,但是当实际测量时你可能会感到惊讶并且知道它可能比你获得的更大(所以其他人说的是真的:除非你已经测量过,否则不要优化)。

值得注意的是,在Linux内核中,他们不久前开始非内联最初的内联函数,因为成本太高(较大的函数消耗了更多的cpu内存缓存,并且导致的缓存未命中比仅调用函数更昂贵这是打算内联的)。 有关详细信息,请参阅doc / Documentation / CodingStyle中的 “第15章:内联疾病”。

基本上,在C / C ++中,编译器可以内联函数,这意味着代码不会进行函数调用来执行该操作,而是将代码添加到调用函数的块中,因此它就好像它从来就不是一个单独的function调用。

这将更详细地介绍: http : //www.codersource.net/cpp_tutorial_inline_functions.html

内联是指编译时优化,其中一小段代码函数将被注入调用函数,而不需要单独调用。

编译器优化答案是正确的。 但是还有另一种用法 – 在重构中 ,内联是指用方法体替换方法调用然后删除方法。 请参阅内联方法 。 有类似的重构,例如内联类 。

编辑:请注意,重构是手动完成或使用工具完成的; 在任何一种情况下,它都涉及更改源代码。

内联函数通常用于C ++头文件而不是Java。 C ++头文件通常不包含已实现的代码,并且被视为同名cpp文件的接口,该文件通常包含已实现的代码。 在头文件中包含内联函数是合法的,通常是一个小的轻量级函数。 内联函数确实需要付出代价,因此它们不应该是大量内存密集型操作。 对于小型例程,性能损失很小,为方便起见,它们更常用。

在该讨论中,如果允许JIT(即时)编译器允许基于时间的增强,Jon Skeet在运行时提到了客户端jvm(热点)v Server jvm的性能改进。 这就是Java中的“如何完成”。

最初,未被许多地方调用的小部分代码将由编译器“内联”,这意味着所谓的单例将直接放在指令指针代码路径中,执行函数分支并返回成本更高的处理器功率而不只是展开循环或函数调用并将指令“放在那里”

今天,Singleton是多页讨论和循环展开的主题,并且像内联这样的东西在某种程度上已从其原始上下文中删除。 你可以阅读Dov Bulka关于此事的非常明智的工作,以便让C / C ++对此事采取行动。 对于Java,在java.util中研究它丰富的lib比研究内联和深度编译器问题更能满足你的需求 – 你可以在数据结构上陷入根深蒂固的陷入困境的内部战争中,这可以掩盖对16位代码的调用,以及你的学习曲线没有尽头。

你可以在Java中做instanceof,它类似于一个vf表(请不要热情的人),但想到它就像你用强类型语言写的一样 – 现在将用一种语言写作,字符串可以很容易地突然出现哪里没有生意。 我最近尝试编写用Java构建Image的代码,用C代码完成。 我很快发现自己正在查看oxr表以获得强加密 – 这与我编写的代码无关。

你会如何在C / C ++中编写一个字符串类,它对32字节以下的字符串有一个小缓冲区并捕获指针以便它们只对字符串进行操作?

不试图取笑你或任何东西,它只是一个非常好的开始而不是内联和编译科学的地方。