我是在参考这个讨论。我从未编写过C或C++代码,也没有任何计算机科学背景。但我已经作为Java开发人员工作了5年,现在决定学习更多关于计算机科学的知识,并做一些追赶。
执行某段代码时,每当调用标准函数时,执行时间都会略微增加,而将该函数中的代码直接放入其中则无法维护,因为这显然会导致代码重复混乱。
内联通过让您将函数声明为内联(至少在C ++中),从而解决了性能和可维护性问题,因此当您调用该函数时,而不是在运行时跳转,编译时会将内联函数中的代码注入到每次调用该函数时。
缺点是,如果对您经常调用的大型函数进行内联,则程序的大小可能会显着增加(最佳实践确实建议仅在小型函数上使用)。
http://zh.wikipedia.org/wiki/内联函数
内联展开,或称为内联,是一种编译器优化技术,它将函数调用点替换为被调用函数的函数体。这种优化可能会在运行时改善时间和空间使用情况,但可能会增加最终程序的大小。
int whenToEvaluateZing(int y) {
return daysLeft(y) + daysLeft(0) + daysLeft(y+1);
}
代码清单4. 调用方法
int daysLeft(int x){
if (x == 0)
return 0;
else
return x - 1;
}
清单5. 内联方法
int whenToEvaluateZing(int y){
int temp = 0;
if(y == 0) temp += 0; else temp += y - 1;
if(0 == 0) temp += 0; else temp += 0 - 1;
if(y+1 == 0) temp += 0; else temp += (y + 1) - 1;
return temp;
}
int whenToEvaluateZing(int y){
if(y == 0) return y;
else if (y == -1) return y - 1;
else return y + y - 1;
}
正如其他答案中已经提到的那样,内联有一定的代价。通常认为这个代价很小,但是实际测量时可能会发现代价比你所获得的更大(所以其他人说的是正确的:不要优化除非你已经测量过了)。
值得注意的是,在Linux内核中,他们在一段时间前开始取消原本内联的函数,因为代价太高(较大的函数会占用更多的CPU内存缓存,导致缓存失效的代价比调用原本应该内联的函数更高)。详情请参见doc/Documentation/process/coding-style.rst的“第15章:内联病”。
内联函数通常用于C++头文件而不是Java。C++头文件通常不包含已实现的代码,并被认为是同名cpp文件的接口,该cpp文件通常包含实现的代码。在头文件中包含内联函数是合法的,通常是一些小型轻量级的函数。内联函数确实会有一些成本,因此它们不应该是大型内存密集型操作。对于小型例程,性能损失很小,更多地用于方便性。
在Java中,您可以使用instanceof,它类似于vf-table(请不要激动,但是请想象一下您一直在编写强类型语言,现在将要编写的是一个字符串可以轻松地逃脱并在没有业务的情况下四处探索的语言。最近我尝试从C代码中构建Java中的图像。很快我发现自己正在查看用于强加密的oxr表-这与我正在编写的代码无关。
您会如何在C / C ++中编写一个字符串类,该类具有小于32个字节的字符串的小缓冲区,并捕获指针,使其仅对字符串进行操作?
我并不是要挑逗你或者什么的,只是这是一个非常好的起点,而不是内联和编译器科学。