函数使用NRV优化需要遵循哪些规则?
What rules to follow for a function to use NRV optimization
我应该遵循什么规则或技巧来使函数在函数中使用NRV(命名返回值)优化?我从不同的地方吸收了这些技巧,但不知道我的理解是否正确:
- 要返回的对象不应该在函数中有任何名称(那么为什么它被称为NAMED返回值优化!!)
- 返回语句应该有一个用圆括号包围的对象 要返回的
- 对象应该具有显式和内联的复制构造函数
如果您指的是NRVO(命名返回值优化)而不是RVO(返回值优化),那么对象必须在函数中命名。否则,它将只符合RVO,而不是NRVO。所以有一个很好的理由叫它Named返回值优化。
请看下面的例子:
RVO:
BigObject foo(int x, int y)
{
// Returned BigObject is created ad-hoc, and has no local 'name'.
return BigObject(x, y);
}
void bar()
{
BigObject obj = foo(4, 6);
}
将被优化编译器翻译成以下伪代码:
void foo(int x, int y, BigObject& ret)
{
ret._constructor_(x, y);
}
void bar()
{
BigObject obj; // Allocate obj on the stack, but don't construct it just yet!
foo(4, 6, obj); // Now obj is constructed by foo()
}
NRVO:
BigObject foo(int x, int y, int z)
{
// Returned BigObject has a local 'name' in foo(), which is obj.
BigObject obj(x, y);
// Do something with obj
obj.setZ(z);
return obj;
}
void bar()
{
BigObject obj = foo(4, 6, 7);
}
将被优化编译器翻译成以下伪代码:
void foo(int x, int y, int z, BigObject& ret)
{
ret._constructor_(x, y);
// Do something with ret
ret.setZ(z);
}
void bar()
{
BigObject obj; // Allocate obj on the stack, but don't construct it just yet!
foo(4, 6, 7, obj); // Now obj is constructed by foo()
}
请注意,优化是否真正发生在很大程度上取决于编译器。有些编译器(比如非常老的编译器)根本不会做RVO或NRVO,而其他编译器可能对这种优化有不同的限制。以下是MSVC对NRVO的约束描述:http://msdn.microsoft.com/en-us/library/ms364057 (v = vs.80) . aspx # nrvo_cpp05_topic3
相关文章:
- 此代码是否违反一个定义规则
- 生成文件不对文件使用隐式规则
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 静态结构和一个定义规则
- 尽管遵循了规则,内存泄漏在哪里
- 这是关于成员访问规则的正确摘要吗
- uint_not_usable_without_attribute在业力规则中使用数字生成器时静态断言失败
- 增强精神解析器规则以检测语句中的特殊结尾
- 制作文件:没有规则来制定目标:如何设置正确的规则?
- 为什么此指针值不能转换为整数的规则是什么?
- 传递通用函数,用于梯形规则的数值积分
- C++内存模型中的确切规则阻止在获取操作之前重新排序
- 模板如何影响C++中隐式声明的规则?
- antlr 规则上下文是否可以独立于目标
- Bison/flex 在识别规则后等待输入
- 生成文件中隐式规则中的 -c 标志出错
- 单链接列表实现,规则为 3
- 指针算术规则中的"possibly-hypothetical"是什么意思?
- 假设声明中某些上下文中需要的名称查找规则是什么
- 函数使用NRV优化需要遵循哪些规则?