gpt4 book ai didi

c++ - 在没有返回值优化的情况下将两个对象相加会创建多少个临时对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:53 24 4
gpt4 key购买 nike

在阅读 Scott Meyers 的“更有效的 C++”一书的第 20 和 22 项之后,我决定问这个问题。

假设您编写了一个类来表示有理数:

class Rational
{
public:
Rational(int numerator = 0, int denominator = 1);

int numerator() const;
int denominator() const;

Rational& operator+=(const Rational& rhs); // Does not create any temporary objects
...
};

现在假设您决定使用 operator+= 实现 operator+:

const Rational operator+(const Rational& lhs, const Rational& rhs)
{
return Rational(lhs) += rhs;
}

我的问题是:如果禁用返回值优化operator+ 会创建多少临时变量?

Rational result, a, b;
...
result = a + b;

我相信会创建 2 个临时对象:一个是在 operator+ 的主体内执行 Rational(lhs) 时,另一个是 operator+< 返回的值 是通过复制第一个临时文件创建的。

当 Scott 介绍这个操作时,我感到很困惑:

Rational result, a, b, c, d;
...
result = a + b + c + d;

并写道:“可能使用 3 个临时对象,每次调用一个 operator+”。我相信,如果禁用返回值优化,上述操作将使用 6 个临时对象(每次调用 operator+ 时使用 2 个),而如果启用,操作above 根本不使用临时对象。斯科特是如何得出他的结果的?我认为唯一的方法是部分应用返回值优化

最佳答案

我认为您考虑的太多了,尤其是在优化细节方面。

对于 result = a + b + c + d;,作者只是想声明将创建 3 个临时对象,第一个用于 a + b< 的结果,然后第2个是temporary#1 + c的结果,第3个是temporary#2 + d,然后赋值给结果。之后,3 个临时物被销毁。所有临时值仅用作中间结果。

另一方面,一些习语如expression templates可以通过消除临时性直接得到最终结果。

关于c++ - 在没有返回值优化的情况下将两个对象相加会创建多少个临时对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48424584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com