c++:何时传递指针与返回对象

c++: When to pass pointers versus returning objects

本文关键字:返回 对象 指针 何时传 c++      更新时间:2023-10-16

我刚刚开始使用c ++,我想知道是否有一些关于何时执行以下操作的指南:

假设我想返回一个结构或对象。在什么情况下,哪种方法会更好?

void PopulateStruct(MyStruct* struct) {
struct->a = x;
struct->b = y;
}
void Caller() {
MyStruct s;
PopulateStruct(&s);
}

或:

MyStruct PopulateStruct() {
MyStruct s;
s.a = x;
s.b = y;
return s;
}
void Caller() {
MyStruct s = PopulateStruct();
}

我的基本理解是,如果结构/对象非常小,那么后一种选择可能很好(更好?(,因为复制会很快,编译器也可能使用 RVO 来避免实际复制。

也许如果对象真的很大,那么你希望前者避免那个副本?

根据Herb Sutter和Bjarne Stroustrup的CppCore指南,第二个例子是推荐的方法。它使代码推理更容易,并且在某些情况下不会强制您创建未初始化的对象。

准则F.20

返回值是自我记录的,而 & 可以是 in-out 或 out-only,并且容易被滥用。

在现代编译器中,返回对象可以使用移动语义来完成,即使没有移动语义也足够快。

这取决于您是希望应用范围销毁,还是希望程序员处理要返回的对象的所有权。