最快的c++返回值的方法
Fastest C++ way to return a value
我不是c++专家,我正在寻找从函数返回值的最快方法。例如,要将值作为函数参数传递,最快的方法是使用const引用:
void foo(const bar& parameter);
是可能做这样的东西与返回值?如果我返回一个引用,可能是这样的:
bar& foo();
我在运行时可能有任何问题,因为引用的变量不再存在(因为函数foo已经结束)。谢谢你的建议,抱歉我的英语不好
我认为最好和最干净的方法是指望编译器执行RVO复制省略。这是优化可以改变可观察行为的少数例外之一,在现代流行的编译器中被广泛使用。
返回引用可能不合适,因为您需要确保该对象在返回之后存在。这适用于返回类属性的方法。但是,如果对象是在函数中创建的,就不那么容易了。
除此之外,当然可以返回一个指针。但是必须有人释放这个对象,或者你需要使用某种智能指针。
关于std::move
,当你想要"快速返回"并且不信任编译器时,盲目地使用它并不是一个好主意。参考:std::move何时用于函数返回值?
重申IMO,最好的方法是编写允许(N)RVO并信任编译器的代码。
按值返回并帮助编译器进行RVO是最好的。
一种"帮助"编译器确保函数总是返回相同的声明实例(而不是任何其他实例-当依赖于任何条件时)的方法。
For instance do
bar f() {
bar revtal;
..
return retval
}
但不
bar f() {
bar retval1;
bar retval2;
if(somecondition)
return retval1;
else return
retval2;
}
确实会有问题。只有在返回对象的生命周期不受函数作用域限制的情况下(例如,可以返回对对象成员的引用),才能执行此操作。
对于小型pod对象按值返回通常没有问题。对于更复杂的对象,特别是动态内存分配,使用c++ 11的move语义是最好的方法。如果你的bar定义了一个move构造函数,你按值返回它,如果你从函数中按值返回一个实例,它将被自动使用(而不是复制构造函数)。
编辑:我同意所有其他人说RVO是最好的选择,当它工作时,但如果"可能的复制省略"不够好(即非常昂贵的副本),你应该实现一个移动构造函数。可以返回引用,但要注意返回对对象字段的引用,而不是函数的局部变量。
并且注意只在对象的生命周期内维护引用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 不能将方法返回的值用于另一个方法
- 方法错误"not all control paths return a value"和方法不返回值
- 对象引用中的字段以不同的方法返回不同的值
- 实例化对象并调用方法,使用单行语法在 C# 或 C++ 中返回值?
- 哪种返回值的方法在C++中效果更快?
- 使用新的c++返回值语法的Const方法
- 找不到使保证返回值优化工作的方法
- 在虚拟方法上返回值
- 为什么未调用具有常量参考返回值的超载方法
- 为循环中多次调用的函数返回值预分配内存的正确方法是什么
- 从 r 值引用限定方法返回 r 值引用是否是一种好的做法?
- C++ shared_ptr从派生方法返回此值
- 如何打印通过类方法返回的值
- 从函数捕获和初始化多个返回值的任何直接方法
- 返回值上的 C++ 方法链接不起作用
- C :不同类型的模板功能(方法)的自定义返回值
- 在从方法返回值中使用模板
- 使用方法返回值作为参数c++
- Turtle Mock: MOCK_EXPECT如果被Mock的类方法返回值则失败