代码之家  ›  专栏  ›  技术社区  ›  Pharap wonce

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

  •  1
  • Pharap wonce  · 技术社区  · 11 年前

    我在写一门向量课(在数学意义上,而不是在 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 回复  |  直到 11 年前
        1
  •  1
  •   Nikolay K    11 年前

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

    1) 只有在第一种情况下,它才会尝试自动内联函数,因此添加 inline 关键字。

    2) 在2-3种情况下,您必须添加 内联 关键字,然后 大概 它将被内联。(仍取决于编译器)

    3) 在情况4和5中,函数无法内联,因为 .lib .dll 已编译。(和 .dll文件 甚至只在运行时加载!)

    许多编译器还支持一个选项,允许它们自动内联任何合适的函数( -O3 在里面 gcc ).