函数被内联的可能性取决于它在 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)。