首页 > 解决方案 > 使用此指针与使用两个参数的内联函数的性能影响

问题描述

背景

我正在从《游戏引擎开发基础》第 1 卷:数学一书中学习与游戏引擎相关的数学。
如果我没有阅读这本书并查看其中的示例,运算符重载的实现似乎与我会做的方式不同。我想看看作者的编码方式是否会对性能产生影响。寻找这个问题的答案很困难,我只能找到其他关于内联的问题,这些问题与比较这些特定样式的声明运算符重载无关。

这个例子

Vec3.h 版本 1

class Vec3
{
public:

    float x;
    float y;
    float z;

    Vec3(float x, float y, float z);

    inline Vec3 operator+(const Vec3& rval) const
    {
        return Vec3(this->x+rval.x, this->y+rval.y, this->z+rval.z);
    }
};

对比

Vec3.h 版本 2

class Vec3
{
public:
    float x;
    float y;
    float z;
    Vec3(float x, float y, float z);

};
inline Vec3 operator+(const Vec3& lval, const Vec3& rval)
{
    return Vec3(lval.x+rval.x, lval.y+rval.y, lval.z+rval.z);
}

问题

版本 1 是我实现 operator+ 重载的方式。这似乎是 C++ 的方式,使操作符成为类的方法。

然而,我在整本书中看到作者在声明重载时继续使用版本 2。他在类定义之外声明它们并使用2 个参数(lval 和 rval)而不是隐含的 this(lval)和右手参数(rval)

如果您尝试同时实现两者,可以理解的是编译器错误说它是模棱两可的。这正是我在这里问这个问题的原因。对我来说,它是等价的,我宁愿没有一个函数位于全局空间中,所以我会实现版本 1。

但是,我认为实现版本 2 可能有性能原因。也许内联对编译器来说更容易,或者由于作者未提及的某些神秘原因,它执行得更快。

我的另一个想法是,在这种情况下,内联实际上可能更像“静态”。我在其他地方读到,无论如何编译器几乎都忽略了内联,因为无论如何它都会尝试内联它。

做的时候

Vec3 v1(1,2,3);
Vec3 v2(1,2,3);
Vec3 v3 = v2-v1;

哪个表现更好?或者,这只是一种偏好?此外,它的行为会根据 C++ 版本而有所不同吗?(因此标记为 C++11、14 和 17)

标签: c++c++11c++14c++17

解决方案


推荐阅读