c++ - 使用此指针与使用两个参数的内联函数的性能影响
问题描述
背景
我正在从《游戏引擎开发基础》第 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)
解决方案
推荐阅读
- javascript - bot 的用户名未定义
- python - RDFLIB Python 是否支持 Geosparql 查询?
- javascript - 在不使用 JSON.stringify 的情况下将数组转换为有效的 JSON 字符串?
- php - 如何从不同的表中获取相关的记录项
- arrays - 从数组中获取某些元素
- c# - 尝试使用 selectedChanged 在 C# 的 WPF 中的文本框中显示组合框元素
- google-apps-script - 通过脚本打印到谷歌电子表格聊天/记录所有用户可见的值
- javascript - 为什么 JavaScript Promise.all 没有解决承诺
- javascript - 一旦我第一次单击,它应该以我每 10 秒在字段中更改的值运行并自动提交
- android - 'void android.widget.SearchView.setOnQueryTextListener(android.widget.SearchView$OnQueryTextListener)' 在空对象引用上