41|对象传参和返回的最佳实践
该思维导图由 AI 生成,仅供参考
传统的对象传递方式
- 深入了解
- 翻译
- 解释
- 总结
现代 C++ 中对象传参和返回的最佳实践涉及传统的对象传递方式和现代 C++ 的对象传递方式。传统方式建议优先使用返回对象的方式,但对于复制代价高的对象,推荐在堆上分配并返回指针。现代 C++ 中,移动的代价成为衡量标准,可以返回 `vector` 或 `unique_ptr` 等对象。针对移动的优化包括使用移动构造函数和移动赋值运算符。另外,值传参也是一种简化的写法,但在重复调用场景下可能不合适。总的来说,现代 C++ 中的对象传参和返回建议更加注重移动语义和性能优化。 文章还深入探讨了对象传递的各种方式,包括使用完美转发、`string_view` 的使用以及对于字符串特殊处理的讨论。对于追求极致性能的情况,可以使用重载、移动和完美转发来进行优化。对于大部分情况,较为传统的对象传递方式仍然是较为合理的默认值。而对于字符串字面量,使用 `string_view` 是一个对字符串字面量更为友好的选择。 总的来说,本文对于现代 C++ 中对象传参和返回的最佳实践进行了深入探讨,对于读者快速了解现代 C++ 中对象传参和返回的方式具有重要参考价值。
《现代 C++ 编程实战》,新⼈⾸单¥59
全部留言(5)
- 最新
- 精选
- 李云龙老师,这个版本的set_name: void set_name(string_view name) { name_ = name; } 为什么给set_name函数传入一个右值字符串,会存在性能损失?string_view直接绑定到了一个右值上,除了生命周期陷阱,应该没有其他性能损失吧?
作者回复: 如果使用 string&& 作为参数的话,是可以直接把字符串移动进去,不需要任何新内存分配,也不需要复制字符串内容。用 string_view 显然肯定会发生字符串内容复制,也有可能发生内存分配。 没有生命周期陷阱,如果 name_ 的类型是 string 的话。(string_view 不适合作为成员变量的类型,很危险。)
2023-11-26归属地:北京1 - Geek_1a7863在“不可教授”的极致性能传参方式小节中,模板参数 enable_if_t<is_assignable_v<string&, S>>>,为什么要用string的引用不用string呢??
作者回复: 因为你写 x = y 的时候,x 的类型就应该是个左值引用。这里表达的就是允许从 S 类型(转发引用)到 string&(右值引用)的赋值。
2023-01-19归属地:河北31 - 王小白白白当我们采用 string 的值传参时,对于左值参数,我们每次都必然会发生一次内存分配操作(通常还伴随着老的 name_ 的内存释放。 老师,这里的一次内存分配操作, 是指构造string参数吗
作者回复: 是的,每次都构造了一个新的string。
2022-09-02归属地:上海1 - Ghostown吴老师请问,在Herb的那张图中,使用 const string& 且入参是xvalue时为什么性能也很好?(我理解既然是生成了string的临时对象,那么就需要拷贝或内存分配)但是看图上似乎并没有发生拷贝/内存分配?
作者回复: 因为被赋值的对象本身有“容量”,所以(至少在若干次赋值之后)就不再有内存的分配,但会有内存的拷贝——这相比内存分配和释放来说就小多了。 如果使用 const string&、string&& 或 string 作为形参,那在实参为 const char* 且超过小字符串优化的允许范围时,都会临时构造一个 string,会多发生一次字符串复制和堆上内存分配,而只有完美转发的方式没有这种额外开销。
2023-09-10归属地:上海3 - 李聪磊这篇文章把各种情况梳理的太棒了,受益匪浅!2022-09-12归属地:北京