gpt4 book ai didi

c++ - 在 C++11 中,是否仍然需要传递对将接受函数输出的对象的引用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:10 25 4
gpt4 key购买 nike

在 C++11 之前,如果我有一个对大对象进行操作的函数,我的直觉会是用这种原型(prototype)编写函数。

void f(A &return_value, A const &parameter_value);

(这里,return_value 只是一个空白对象,它将接收函数的输出。A 只是一些大且复制成本高的类。)

在 C++11 中,利用 move 语义,默认建议(据我所知)更直接:

A f(A const &parameter_value);

是否还需要用旧方法传递一个对象来保存返回值?

最佳答案

其他人已经涵盖了 A 可能没有便宜的 move 构造函数的情况。我假设您的 A 会。但是还有一种情况你可能想要传入一个“out”参数:

如果 A 是某种类型,如 vectorstring 并且已知“out”参数已经有资源(例如内存) 可以在 f 中重用,那么如果可以的话重用该资源是有意义的。例如考虑:

void get_info(std::string&);
bool process_info(const std::string&);

void
foo()
{
std::string info;
for (bool not_done = true; not_done;)
{
info.clear();
get_info(info);
not_done = process_info(info);
}
}

对比:

std::string get_info();
bool process_info(const std::string&);

void
foo()
{
for (bool not_done = true; not_done;)
{
std::string info = get_info();
not_done = process_info(info);
}
}

在第一种情况下,容量将在循环执行时在 string 中累积,然后该容量可能会在循环的每次迭代中重复使用。在第二种情况下,每次迭代都会分配一个新的 string(忽略小字符串优化缓冲区)。

这并不是说您永远不应该按值返回 std::string。只是您应该意识到这个问题并根据具体情况应用工程判断。

关于c++ - 在 C++11 中,是否仍然需要传递对将接受函数输出的对象的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11060928/

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