编译器是否在返回成员变量的情况下执行返回值优化
Does the compiler perform return value optimisation in case of returning member variable?
给定以下代码
class foo
{
private:
boost::shared_ptr <std::deque<foo> > m_ptr;
public:
foo();
boost::shared_ptr <std::deque<foo> > get_my_ptr()
{
return m_ptr;
}
};
当我们像这样调用get_my_ptr()
函数时
boost::shared_ptr <std::deque<foo> > ptr = get_my_ptr()
编译器调用复制构造函数来创建 ptr 对象还是可以执行 nrvo?我们这样称呼它有什么区别
const boost::shared_ptr <std::deque<foo> >& ptr = get_my_ptr()
使用 NRVO,如果return 语句的表达式是具有自动存储持续时间的本地非易失性对象的名称,它不是函数参数。该本地对象直接在存储中构造,否则函数的返回值将被复制到其中。成员变量不满足这些条件。仅当您创建了成员的本地副本时,我才有可能:
boost::shared_ptr<std::deque<foo>> get_my_ptr()
{
auto p = m_ptr;
return p;
}
在您的示例中,将调用复制 ctor,这将增加共享指针的引用计数器。如果将返回的对象绑定到 const 引用,也会发生同样的情况。
返回成员变量时,编译不得执行 RVO。如果是这样,则对象将留下无效成员。
相关文章:
- 防止SC_METHOD在没有事件/触发器的情况下执行
- C++项目编译强制使用 /clr 选项,尽管在没有公共语言运行时支持的情况下执行它
- C++:如何在不将命令传递给 shell 的情况下执行文件?
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 可以在没有MATLAB安装的情况下执行C 到MATLAB代码接口
- 如何在没有对象的情况下执行插槽功能
- 有没有办法在不知道每个进程中每个数组的大小的情况下执行MPI_Gatherv?
- 派生类中的方法在引用的类中没有 *virtual* 关键字的情况下执行
- C++。可以在没有错误的情况下执行此操作:"未在此范围内声明"
- 在不使用单个 if 的情况下执行一些语句
- 如何使用循环检查等效性,然后在没有等效性的情况下执行一些代码?
- 是否可以在不重新打开重新打开 win32 窗口的情况下执行需要提升的任务
- 如何在没有sudo的情况下执行python OpenCV程序
- 在vsync打开的情况下执行glTexImage2D时出现奇怪的延迟
- C++应用程序在没有屏幕输出的情况下执行
- 编译器是否在返回成员变量的情况下执行返回值优化
- 宏的参数是否在给定 #define(void)0)的情况下执行?
- Sqlite3/C++在不更改数据库大小的情况下执行DELETE语句
- 在实时应用程序中最坏情况下执行的最快c++映射
- 如何在复杂情况下执行宏替换