use*_*748 5 c++ heap stack memory-management
这是我的问题.我有一个函数,它接受struct
输入,分配一个新的struct
然后返回它.将struct
具有以下内容
struct Data {
std::vector<custom_type> vector_vars;
std::string key;
std::map<std::string, Data*> index;
};
Run Code Online (Sandbox Code Playgroud)
vector_vars
的大小为500-1000.custom_type如果相关是这个类.在index
帮助我访问不同Data
的结构key
.这是功能.
Data func(Data inputData) {
Data outputData;
//compare values with inputData
//change some values in Data struct
return outputData
}
Run Code Online (Sandbox Code Playgroud)
我是否使用堆栈分配并将其返回以便将其复制到RHS.这是否可取,因为复制可能会产生大量开销?
我可以在函数内返回在堆栈上分配的struct的引用/指针吗?
std::shared_ptr
为了提高效率,是否建议使用动态分配(可能是)?
Jos*_*eld 14
按值返回对象.复制省略是一种优化,标准允许编译器删除不必要的副本.在C++ 03中,编译器几乎肯定会删除该副本.在C++ 11中,副本将首先被视为一个移动(它将反过来移动其内容),甚至可能被忽略.
在
return
具有类返回类型的函数的语句中,当表达式是具有与函数返回类型相同的cv-unqualified类型的非易失性自动对象(除函数或catch子句参数之外)的名称时,通过将自动对象直接构造到函数的返回值中,可以省略复制/移动操作
具体而言,当这一标准导致复制省略,这就是俗称的命名返回值优化的形式返回值优化.
因此,这里最具惯用性和性能友好的选择是按价值返回.当然,如果您测量即使在优化下按值返回也是一个问题,那么您可以考虑动态分配(参见第3点).
不,您不应该返回指向局部变量的引用或指针.具有自动存储持续时间的对象(您在堆栈上称为分配的对象)将不再存在.引用或指针将悬空.以任何有意义的方式使用它将导致未定义的行为.
不,如上所述,建议按价值返回.但是,如果您确实需要,您可以动态分配Data
并通过智能指针返回它.这里首选的智能指针std::unique_ptr
是你的功能是将所有权传递给调用函数(不共享所有权).