gpt4 book ai didi

c++ - 返回对象的两种形式有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 20:14:47 27 4
gpt4 key购买 nike

我正在尝试为创建为 Integer 类的二进制 + 重载:

const Integer operator+(const Integer& left,const Integer& right) 
{
return Integer(left.i + right.i);
}

 const Integer operator+(const Integer& left,const Integer& right)
{
Integer tmp(left.i + right.i);
return tmp;
}

现在我学到的是,在第一种情况下,创建并返回一个临时 Integer 对象,在第二种情况下,通常使用构造函数调用创建对象,然后复制,然后调用析构函数。 Ecekl 对第一个所说的是,编译器通过将对象直接构建到外部返回值的位置来利用这一点。我们从中推断出什么?我阅读了有关返回值优化的内容,但无法通过直接复制到位置来了解它的含义。

最佳答案

绝对没有区别,在大多数情况下,一个体面的编译器会将第二种形式优化为第一种形式 - 并将通过 Named Return Value Optimization (NRVO) 执行复制/移动省略。当返回 tmp 时。

如果第二种形式使代码更易读,或者更易于维护和/或调试,您可能希望使用第二种形式。如果您担心性能,那是没有理由的(除非您关闭了编译器优化,但这表明您一开始就对性能不感兴趣)。

但是请注意,返回 const Integer 没有多大意义。由于您按值返回,因此您应该返回一个 Integer:

Integer operator + (const Integer& left, const Integer& right) 
{
return Integer(left.i + right.i);
}

作为最后的评论,这甚至可以重写如下,前提是 Integer 有一个非 explicit 构造函数接受 int (请注意,通常不是这种情况,因为接受一个参数的构造函数通常被标记为 explicit 以避免尴尬的隐式转换):

Integer operator + (const Integer& left, const Integer& right) 
{
return left.i + right.i;
}

关于c++ - 返回对象的两种形式有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15323895/

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