内联函数原型vs正则声明vs原型

Inline function prototype vs regular declaration vs prototype

本文关键字:vs 原型 声明 函数      更新时间:2023-10-16

内联函数和main函数之间的区别是什么:

inline double cube(double side)
{
   return side * side * side;
}
int main( )
{
    cube(5);
}

vs只是定期声明一个函数,比如:

double cube(double side)
{
   return side * side * side;
}
int main( )
{
    cube(5);
}

vs功能原型?

double cube(double);
int main( )
{
    cube(5);
}
double cube(double side)
{
   return side * side * side;
}

inline函数可以在多个翻译单元(cpp文件+includes(中定义,并且是编译器内联函数的提示。它通常被放在一个头中,这会增加编译时间,但可以导致更快的代码。它还允许从许多编译单元使用函数。

//cube.h
inline double cube(double side)
{
   return side * side * side;
}
//cube.cpp
int main( )
{
    cube(5);
}

定期定义它是一种正常的方法,它(通常(在cpp文件中定义,并链接到。它不容易从其他编译单元中使用。

//cube.cpp
double cube(double side)
{
   return side * side * side;
}
int main( )
{
    cube(5);
}

原型允许您告诉编译器某个函数将在链接时存在,即使它还不完全存在。这允许main调用函数,即使它还不存在。通常,原型在头中,因此其他编译单元可以调用该函数,而无需自己定义它。这具有最快的编译时间,并且该函数很容易从其他编译单元使用。

//cube.h
double cube(double);
//cube.cpp
int main( )
{
    cube(5);
}
double cube(double side)
{
   return side * side * side;
}

性能方面,它们都是一样的,因为inline只是编译器的一个提示。如果使用声明/定义的分离,并且定义在不同的翻译单元上,那么编译器将更难内联它(但也有这样的实现(。

是否生成函数inline的区别在于,如果链接器多次看到函数的同一内联定义,它不会抱怨。

3程序编译为与g++ -S -O3 $file.cc完全相同的程序。除了第二个例子,其中double cube(double side)的定义虽然在int main()中内联,但仍然以非内联形式存在。

_main:
pushl   %ebp
movl    $16, %eax
movl    %esp, %ebp
subl    $8, %esp
andl    $-16, %esp
call    __alloca
call    ___main
leave
xorl    %eax, %eax
ret

当您内联声明函数时,编译器会尝试通过或多或少地将函数体复制到调用它的位置来加快代码的速度。这只是一个建议,是否可能由编译器来决定。

我不确定第三个例子会发生什么。我想这将取决于所使用的工具链。