函数被内联的可能性取决于它在 C++ 中的定义位置
Likelihood of a function being inlined depending on where it is defined in C++
当我开始思考 class 方法被内联的可能性时,我正在写一个 Vector class(在数学意义上,而不是在 std::vector
意义上),取决于函数的定义方式。
我对以下案例感兴趣:
情况1,函数体定义在头文件中声明的地方。例如
// Vector.h
class Vector
{
public:
// Other stuff up here
float Magnitude(void) const
{
return sqrt(X*X + Y*Y);
}
// Other stuff down here
}
Case 2,函数体在初始class定义后的头文件中定义。例如
// Vector.h
class Vector
{
public:
// Other stuff up here
float Magnitude(void) const;
// Other stuff down here
}
// Other stuff up here
float Vector::Magnitude(void) const
{
return sqrt(X*X + Y*Y);
}
// Other stuff down here
案例3,函数体在相应的.cpp
文件中提供,声明和定义分开。例如
// Vector.h
class Vector
{
public:
// Other stuff up here
float Magnitude(void) const;
// Other stuff down here
}
//Vector.cpp
#include "Vector.h"
// Other stuff up here
float Vector::Magnitude(void) const
{
return sqrt(X*X + Y*Y);
}
// Other stuff down here
案例 4,函数定义在作为编译器输入提供的相应 .lib
文件中提供。
案例 5,函数定义在相应的 .dll
链接文件中提供。
在这5种情况下,函数被内联的概率分别是多少?我不是说一个确切的概率,我的意思是相互比较,哪些更有可能内联,哪些不太可能?
其他信息:
我故意忽略 inline
关键字以简化问题,使其不会太宽泛。我知道还有许多其他问题可以解决内联问题,但我找不到关于每个案例的足够信息来特别解决这个问题。另外,我知道已经存在带有矢量 classes 预制的库,这不是练习的重点。
这主要取决于编译器,因为它们可以自由地内联任何函数。
1) 只有在第一种情况下它会尝试自动内联函数,所以它是多余的,添加 inline
关键字。
2) 在情况 2-3 中,您必须添加 inline
关键字,然后 可能 将其内联。 (仍然取决于编译器)
3) 在情况 4 和 5 中,无法内联函数,因为 .lib
和 .dll
的代码已经编译。 (而且 .dll
甚至只在运行时加载!)
许多编译器也支持一个选项,可以让它们自动内联任何合适的函数(-O3
in gcc
)。
当我开始思考 class 方法被内联的可能性时,我正在写一个 Vector class(在数学意义上,而不是在 std::vector
意义上),取决于函数的定义方式。
我对以下案例感兴趣:
情况1,函数体定义在头文件中声明的地方。例如
// Vector.h
class Vector
{
public:
// Other stuff up here
float Magnitude(void) const
{
return sqrt(X*X + Y*Y);
}
// Other stuff down here
}
Case 2,函数体在初始class定义后的头文件中定义。例如
// Vector.h
class Vector
{
public:
// Other stuff up here
float Magnitude(void) const;
// Other stuff down here
}
// Other stuff up here
float Vector::Magnitude(void) const
{
return sqrt(X*X + Y*Y);
}
// Other stuff down here
案例3,函数体在相应的.cpp
文件中提供,声明和定义分开。例如
// Vector.h
class Vector
{
public:
// Other stuff up here
float Magnitude(void) const;
// Other stuff down here
}
//Vector.cpp
#include "Vector.h"
// Other stuff up here
float Vector::Magnitude(void) const
{
return sqrt(X*X + Y*Y);
}
// Other stuff down here
案例 4,函数定义在作为编译器输入提供的相应 .lib
文件中提供。
案例 5,函数定义在相应的 .dll
链接文件中提供。
在这5种情况下,函数被内联的概率分别是多少?我不是说一个确切的概率,我的意思是相互比较,哪些更有可能内联,哪些不太可能?
其他信息:
我故意忽略 inline
关键字以简化问题,使其不会太宽泛。我知道还有许多其他问题可以解决内联问题,但我找不到关于每个案例的足够信息来特别解决这个问题。另外,我知道已经存在带有矢量 classes 预制的库,这不是练习的重点。
这主要取决于编译器,因为它们可以自由地内联任何函数。
1) 只有在第一种情况下它会尝试自动内联函数,所以它是多余的,添加 inline
关键字。
2) 在情况 2-3 中,您必须添加 inline
关键字,然后 可能 将其内联。 (仍然取决于编译器)
3) 在情况 4 和 5 中,无法内联函数,因为 .lib
和 .dll
的代码已经编译。 (而且 .dll
甚至只在运行时加载!)
许多编译器也支持一个选项,可以让它们自动内联任何合适的函数(-O3
in gcc
)。