gpt4 book ai didi

c++11 - C++11 中返回本地值的最佳方式

转载 作者:行者123 更新时间:2023-12-02 11:26:27 25 4
gpt4 key购买 nike

过去,如果我想要对象 A 的字符串表示形式,我会编写带有签名 void to_string(const A& a, string& out) 的内容以避免额外的副本。这仍然是 C++11 中的最佳实践吗?包括 move 语义等等?

我读过一些关于其他上下文的评论,建议依赖 RVO 并改为编写 string to_string(const A& a)。但 RVO 并不能保证一定会发生!那么,作为 to_string 的程序员,我如何保证字符串不会被不必要地复制(独立于编译器)?

最佳答案

假设函数中的代码采用以下形式:

std::string data = ...;
//do some processing.
return data;

那么需要调用std::string如果省略不可用,则 move 构造函数。所以最坏的情况是,你必须离开你的内部字符串。

如果您无法承担 move 操作的成本,那么您必须将其作为引用。

话虽这么说...您是否担心编译器无法内联短函数?您是否担心小型包装器是否无法得到适当的优化?是否有可能编译器没有优化for循环之类的东西让你烦恼吗?你想想是否if(x < y)if(x - y < 0) 快?

如果不是......那么你为什么关心复制/move 省略(“返回值优化”的技术术语,因为它用在比这更多的地方)?如果您使用的编译器不支持复制省略,那么您使用的编译器很糟糕,可能无法支持大量其他优化。出于性能考虑,您最好花时间升级编译器,而不是将返回值转换为引用。

preventing the improbable case of a copy actually happening is not worth the ... hassle? less readable code? what exactly? what is the extra thing that weights on the side of simple return?

“额外的事情”是这样的:

std::string aString = to_string(a);

比这更具可读性:

std::string aString;
to_string(a, aString);

在第一种情况下,很明显 to_string 立即正在初始化一个字符串。在第二个例子中,事实并非如此;你必须查一下to_string的签名以查看它采用的是非 const 引用。

第一种情况甚至不“惯用”;一般人都会这样写。你永远不会看到to_int(a, someInt)要求整数;这是荒谬的。为什么整数创建和对象创建如此不同?作为程序员,您不必关心返回值或其他内容是否发生了太多副本。您只需以简单、明显且易于理解的方式做事即可。

关于c++11 - C++11 中返回本地值的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18447389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com