函数内联的可能性取决于它在C++中定义的位置

Likelihood of a function being inlined depending on where it is defined in C++

本文关键字:C++ 定义 位置 取决于 可能性 函数      更新时间:2023-10-16

当我开始考虑类的方法被内联的概率时,我正在编写一个 Vector 类(在数学意义上,而不是在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
}

情况 2,函数体在初始类定义之后的头文件中定义。

// 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关键字以简化问题,因此它不会太宽泛。我知道还有许多其他问题可以解决内联问题,但我找不到有关每个案例的足够信息来特别解决这个问题。另外,我知道库已经存在预先制作的向量类,这不是练习的重点。

它主要取决于编译器,因为它们可以自由内联任何函数。

1)只有在第一种情况下,它才会尝试自动内联功能,因此添加inline关键字是多余的。

2

)在情况2-3中,您必须添加inline关键字,然后它可能会被内联。(仍然取决于编译器)

3) 在情况 4 和 5 中,由于 .lib.dll 的代码已经编译,因此无法内联函数。(.dll甚至只在运行时加载!

此外,许多编译器支持一个选项,允许它们自动内联任何合适的函数(-O3 gcc)。