gpt4 book ai didi

c++ - 将传递引用转换为传递返回

转载 作者:搜寻专家 更新时间:2023-10-31 01:08:29 24 4
gpt4 key购买 nike

我有以下功能:

void read_int(std::vector<int> &myVector)

这允许我通过它的引用来填充 myVector。它是这样使用的:

std::vector<int> myVector;
read_int(myVector);

我想重构一下代码(保留原来的功能)以最终得到这个:

auto myVector = read_int();   // auto is std::vector<int> 

实现此目标的最佳中间函数是什么?


在我看来,以下直截了当的答案是次优的:

std::vector<int> read_int() {
std::vector<int> myVector_temp;
read_int(myVector_temp);
return myVector_temp;
}

最佳答案

显而易见的答案是正确的,而且基本上是最优的。

void do_stufF(std::vector<int>& on_this);    // (1)
std::vector<int> do_stuff_better() { // (2)
std::vector<int> myVector_temp; // (3)
do_stuff(myVector_temp); // (4)
return myVector_temp; // (5)
}

(3),我们在自动存储中(在堆栈上)创建了一个命名的返回值。

(5) 中,我们只从函数返回命名的返回值,除了函数中其他任何地方的命名返回值之外,我们从不返回任何其他东西。

由于 (3)(5),编译器被允许(并且很可能会)忽略 myVector_temp 的存在目的。它会直接构造函数的返回值,并调用 myVector_temp .它仍然需要有一个现有的移动或复制构造函数,但它不会调用它。

在另一端,当调用 do_stuff_better 时,一些编译器也可以在调用时省略赋值:

std::vector<int> bob = do_stuff_better();     // (6)

允许编译器有效地传递一个“指向 bob 的指针”并告诉 do_stuff_better()bob 中构造它的返回值的位置,也省略了这个复制构造(好吧,它可以安排调用的发生方式,使得 do_stuff_better() 被要求构造其返回值的位置与 bob 的位置相同)。

并且在 C++11 中,即使不满足两个省略的要求,或者编译器选择不使用它们,在这两种情况下都是 move必须完成而不是 copy .

(5) 行,我们以简单明了的形式返回本地声明的自动存储持续时间变量 return陈述。这使得返回一个隐式的 move如果没有省略。

(6) 行,该函数返回一个未命名的对象,它是一个右值。当bob由它构成,它move -构造。

move ing std::vector包括复制 ~3 个指针的值,然后将源归零,无论 vector 有多大是。无需复制或移动任何元素。

以上两个省略,我们在 do_stuff_better() 中删除了命名的局部变量, 然后我们删除 return do_stuff_better() 的值而是直接构建bob ,有些脆弱。了解允许编译器执行这些省略的规则,以及编译器实际执行省略的情况,都是值得的。

作为它脆弱性的一个例子,如果你有一个分支,在那里你做了一个 return std::vector<int>()在你的do_stuff_better()检查错误状态后,函数中的省略可能会被阻止。

即使省略被阻止或者你的编译器没有为一个案例实现它,容器是 move 的事实'd 意味着运行时间成本将降至最低。

关于c++ - 将传递引用转换为传递返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17974335/

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