【发布时间】:2021-04-18 00:11:07
【问题描述】:
我今天刚看到一所大学在做这个优化:
即,改变这个:
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 anything,它只是让我的表达式返回一个引用。
那么,如果这是真的,通过副本传递值不会比通过引用传递它并调用std::move 慢,或者在这种情况下调用std::move 对堆栈上的对象有帮助吗?如果我理解正确,std::move 应该只帮助处理堆上的对象。那么,用堆栈上的东西调用它应该没有帮助还是有帮助?
相关问题:
【问题讨论】:
-
通过这样的调用,字符串副本只是从函数内部移动到外部...
myfunction(std::move(somestring), 10);会避免复制...但会变异somestring。 -
字符串内部使用动态内存。