内联函数原型与常规声明与原型

时间:2011-10-27 21:00:03

标签: c++ function-prototypes function-declaration inline-functions

内联函数和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;
}

4 个答案:

答案 0 :(得分:6)

inline函数可以在多个转换单元(cpp file + 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;
}

答案 1 :(得分:1)

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

与函数inline的区别在于,如果链接器多次看到函数的内联定义,链接器就不会抱怨。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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