gpt4 book ai didi

c++ - std::move 是否有助于堆栈上的对象?

转载 作者:行者123 更新时间:2023-12-05 09:33:58 27 4
gpt4 key购买 nike

我今天刚看到一个学院在做这个优化:

enter image description here

即,改变这个:

std::string somestring =  "somestring";
std::map<std::string, int> myglobalmap;

std::string myfunction( const std::string& mystring, int myint )
{
myglobalmap.insert( std::pair<std::string, int>( mystring, myint ) );
}
myfunction(somestring, 10)

收件人:

std::string somestring =  "somestring";
std::map<std::string, int> myglobalmap;

std::string myfunction( std::string mystring, int myint )
{
myglobalmap[ std::move(mystring) ] = myint;
}
myfunction(somestring, 10)

他声称通过复制传递值 mystring 而不是将其作为常量引用传递会更快,因为 move 操作只会对堆栈上的对象执行。但我不明白为什么这会有帮助。我搜索了 move 运算符,发现它没有 move anything ,它只是让我的表达式返回一个引用。

然后,如果这是真的,通过复制传递值不会比通过引用传递它并调用 std::move 或者调用 std::move 慢> 在这种情况下帮助处理堆栈上的对象?如果我理解正确,std::move 应该只帮助处理堆上的对象。然后,用堆栈上的东西调用它应该没有帮助还是有帮助?

相关问题:

  1. What is std::move(), and when should it be used?
  2. Is it possible to std::move local stack variables?

最佳答案

and I found out it does not move anything, it just makes my expression to return a reference.

这是正确的。至关重要的是,该函数的结果是一个 xvalue。

Then, if this is true, passing the value by copy would not be slower than passing it by reference and calling std::move or does calling std::move

std::string 的情况下(假设包含的字符串不是非常小),复制和 move 比通过引用和 move 的间接寻址要慢。


在您的第一个示例中,您通过引用间接访问并始终制作拷贝。

在第二个示例中,仅当函数参数为左值时才进行复制。当参数是右值时,第二个比拳头快(只要存储的字符串足够长,差异显着)。


两个版本都有未定义的行为,因为函数被声明为返回非空值,但不返回值。

关于c++ - std::move 是否有助于堆栈上的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66880263/

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