我正在实现一些数学类型,并且我想优化运算符以最大程度地减少创建,销毁和复制的内存量。为了演示,我将向您展示我的Quaternion实现的一部分。
class Quaternion
{
public:
double w,x,y,z;
...
Quaternion operator+(const Quaternion &other) const;
}
我想知道以下两个实现之间的区别。我确实有一个+ =实现,可以在不创建内存的位置进行原地操作,但是某些使用四元数的高级操作使用+而不是+ =很有用。
__forceinline Quaternion Quaternion::operator+( const Quaternion &other ) const
{
return Quaternion(w+other.w,x+other.x,y+other.y,z+other.z);
}
和
__forceinline Quaternion Quaternion::operator+( const Quaternion &other ) const
{
Quaternion q(w+other.w,x+other.x,y+other.y,z+other.z);
return q;
}
我的C++完全是自学成才的,因此在进行某些优化时,我不确定该怎么做,因为我不知道编译器如何确切地处理这些事情。这些机制也将如何转化为非内联实现。
欢迎对我的代码提出任何其他批评。
最佳答案
您的第一个示例允许编译器潜在地使用称为“返回值优化”(RVO)的功能。
第二个示例允许编译器潜在地使用称为“命名返回值优化”(NRVO)的名称。这两个优化显然紧密相关。
可以在此处找到Microsoft实现NRVO的一些详细信息:
请注意,本文指出NRVO支持始于VS 2005(MSVC 8.0)。它没有具体说明是否同样适用于RVO,但我相信MSVC在8.0版之前使用了RVO优化。
This article about Move Constructors by Andrei Alexandrescu很好地了解了RVO的工作方式(以及何时以及为什么编译器可能不使用它)。
包括此位:
该文章写于2003年,到现在应该对编译器进行很大的改进。希望月亮的阶段对编译器何时使用RVO/NRVO不太重要(也许是星期几)。如上所述,MS似乎直到2005年才实现NRVO。也许是在Microsoft从事编译器工作的人买了一双比以前大一双的舒适鞋。
您的示例非常简单,以至于我希望它们都能在最新的编译器版本中生成等效的代码。
关于c++ - 按值返回内联函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1313727/