gpt4 book ai didi

c++ - 返回类型是实例化的还是简单分配的值

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:50:09 26 4
gpt4 key购买 nike

我一直在考虑我的问题的答案,所以我不得不问,返回类型是实例化的还是简单分配的值?

以下面的例子为例:

class Convert {

public:

int getValue (std::string const& _text);

};


Convert convert;
int total(0);

total = convert.getValue("488");

为此; getValue() 成员函数返回结果时发生了什么,步骤是什么?是创建返回类型 int 的实例并将值从临时 int 复制到 total 变量中,还是直接返回值分配到 total 而无需创建临时返回类型 int?

因为我的一些代码有 void getValue (int& _result, std::string const& _text) ;然而,int getValue (std::string const& _text) 是更符合逻辑。

最佳答案

复制省略是一种允许的优化,几乎每个编译器都支持。

复制省略意味着在某些情况下,创建临时拷贝,然后将该临时拷贝复制到命名变量中,然后销毁临时拷贝,可以直接构造变量。

结合返回值优化和移动语义,这意味着返回可移动的复杂对象是高效的。对于 int 这样的类型as-if 规则也在运行:编译器可以执行任何行为,就像执行了该行或代码块一样,并且编译器理解当您复制/移动 int 时会发生什么。周围(即,基本上什么都没有),因此他们可以跳过那些复制/移动。

为确保正确执行 RVO 和复制省略,您需要执行以下操作:

int function() {
int retval = 8; // create the return value in one spot, this makes NRVO possible
// code goes here
return retval; // you can have more than one return statement in most compilers
}

int result = function(); // initialize the variable result by assigning the return value of the function to it.

如果您执行上述操作,大多数编译器将构造 retval对象直接在 result变量存储,如果 function 则根本没有拷贝发生的 body 可以在 result 看到(即使您可能看不到 function 的正文,有些人可能会这样做)

在 C++11 中还有其他技巧。

int function() {
return {7}; // guaranteed to directly construct the return value without a copy
}

int result = function(); // even if copy elision is not done, the temporary `int` is moved into `result`.

如果你阻止复制省略:

int function() {
int foo = 7;
int bar = 3;
// code
if (foo>bar)
return foo;
else
return bar;
}

只要您返回局部变量,就会发生隐式移动。您也可以显式 std::move进入返回值。

现在,对于像 int 这样简单和小的类型,所有这些优化都毫无意义。当您处理更大、更昂贵的对象时,例如 std::vectorstd::vector s,它们每个都有 10 MB 的数据,这些技术意味着按值返回最终与传递要仔细填充的指针一样高效。

关于c++ - 返回类型是实例化的还是简单分配的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17200671/

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