Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内联函数原型vs常规声明vs原型_C++_Function Prototypes_Function Declaration_Inline Functions - Fatal编程技术网

C++ 内联函数原型vs常规声明vs原型

C++ 内联函数原型vs常规声明vs原型,c++,function-prototypes,function-declaration,inline-functions,C++,Function Prototypes,Function Declaration,Inline Functions,inline函数和main函数之间的区别是什么 inline double cube(double side) { return side * side * side; } int main( ) { cube(5); } 而不是定期声明函数,如: double cube(double side) { return side * side * side; } int main( ) { cube(5); } vs功能原型 double cube(double)

inline函数和main函数之间的区别是什么

inline double cube(double side)
{
   return side * side * side;
}

int main( )
{
    cube(5);
}
而不是定期声明函数,如:

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文件+包含)中定义,并提示编译器内联函数。它通常放在一个增加编译时间的头文件中,但会导致更快的代码。它还允许从许多编译单元使用该函数

//cube.h
inline double cube(double side)
{
   return side * side * side;
}

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

int main( )
{
    cube(5);
}
//cube.h
double cube(double);

//cube.cpp
int main( )
{
    cube(5);
}

double cube(double side)
{
   return side * side * side;
}
定期定义它是正常的方法,它(通常)在cpp文件中定义,并根据链接。它不容易从其他编译单元中使用

//cube.h
inline double cube(double side)
{
   return side * side * side;
}

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

int main( )
{
    cube(5);
}
//cube.h
double cube(double);

//cube.cpp
int main( )
{
    cube(5);
}

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

//cube.h
inline double cube(double side)
{
   return side * side * side;
}

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

int main( )
{
    cube(5);
}
//cube.h
double cube(double);

//cube.cpp
int main( )
{
    cube(5);
}

double cube(double side)
{
   return side * side * side;
}

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


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

3程序的编译与
g++-S-O3$file.cc
完全相同。 除了第二个示例之外,
双立方体(双面)
的定义仍然以非内联形式存在,尽管在
int main()
中内联


最后一个是main()之前的函数原型。它们似乎都以相同的方式工作,但我似乎不明白区别是什么……可以在单个编译单元(cpp文件+包含)中定义多次-你是说不同的编译单元吗?不,
inline
可以违反ODR,就像模板一样。否则,将很难在头中放入内联,如果它不在头中,愚蠢的编译器就无法内联它!非常好的解释,先生/女士。非常感谢@MooingDuck:anatolyg是对的,一个
内联
函数在一个翻译单元中只能定义一次,即使它可以在一个程序中定义多次而不违反ODR。最后一个例子是未定义的行为,不需要诊断,如果
cube.h
同时包含在
cube.cpp
和另一个翻译单元中。函数在一个单元中可能不是内联的,而在另一个单元中可能不是非内联的。您指出的区别是实现的细节,一些编译器将始终生成所有函数,即使它实际上是内联的,因为您可以获取
内联的
函数的地址,如果稍后在同一个TU中请求函数的地址,编译器可能不知道在处理该函数时会发生什么情况。