虽然在某些情况下使用内联函数会非常方便,
内联函数有什么缺点吗?
结论:
显然,使用内联函数没有任何问题.
但值得注意的是以下几点!
过度使用内联实际上可以使程序变慢.根据函数的大小,内联它可能会导致代码大小增加或减少.内联一个非常小的访问器函数通常会减少代码大小,而内联一个非常大的函数可以大大增加代码大小.在现代处理器上,较小的代码通常由于更好地使用指令缓存而运行得更快. - Google指南
随着函数大小的增加,内联函数的速度优势趋于减小.在某些时候,与函数体的执行相比,函数调用的开销变小,并且失去了好处- Source
内联函数可能无法正常工作的情况很少:
__inline仅当指定optimize选项时,关键字才会使函数内联.如果指定了optimize,则是否__inline遵循优先级取决于内联优化程序选项的设置.默认情况下,只要运行优化程序,内联选项就会生效.如果指定optimize,则还必须指定noinline选项(如果要__inline忽略关键字).-资源
最新版本的gcc正在制作对我来说没有意义的装配.我没有使用优化编译代码; 但是,即使没有优化,此代码的某些部分也没有意义.
这是C源:
#include <stdio.h>
int main()
{
int a = 1324;
int b = 5657;
int difference = 9876;
int printf_answer = 2221;
difference = a - b;
printf_answer = printf("%d + %d = %d\n", a, b, difference);
return difference;
}
Run Code Online (Sandbox Code Playgroud)
它产生这个组件:
.file "exampleIML-1b.c"
.section .rodata
.LC0:
.string "%d + %d = %d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
pushq %rbx
subq $24, %rsp …Run Code Online (Sandbox Code Playgroud) 我最近决定整理一个头文件,它有很多定义,如下所示:
// api.h
template< typename T>
inline void func( T param )
{
// stuff here
}
Run Code Online (Sandbox Code Playgroud)
所以我想把它变成:
// api.h
#include "api_details.h"
template< typename T>
inline void func( T param )
{
return details::func( param );
}
// api_details.h
namespace details {
template< typename T>
inline void func( T param )
{
// stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
希望这inline不会增加我正在执行的额外副本的成本.
虽然' C++中的答案做内联函数会阻止复制吗?"似乎暗示没有复制,这个问题出现了:
如果内联不复制函数参数,那么下面的行为会不会很糟糕?
inline void change_value( int i ) {
i++;
}
...
int x=5;
change_value(x);
assert(x==5); …Run Code Online (Sandbox Code Playgroud)