3

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

4 回答 4

6

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

//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;
}
于 2011-10-27T21:06:24.010 回答
1

3 程序编译成与g++ -S -O3 $file.cc. 除了第二个例子,double cube(double side)尽管 in 内联,但 的定义仍然以非内联形式存在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
于 2011-10-27T21:55:14.560 回答
1

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

是否创建函数的区别inline在于,如果链接器不止一次地看到同​​一个函数的内联定义,它不会抱怨。

于 2011-10-27T21:05:30.120 回答
0

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

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

于 2011-10-27T21:08:24.283 回答