gpt4 book ai didi

c++ - 我可以在函数的结果上使用 std::move 来构造一个新对象吗?

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

有人可以确认该函数产生的字符串是否真的会被 move 到成员 var 中吗?

class Foo {
private:
const std::string m_complex_str;

std::string create_complex_str() {
return std::string("some huge string");
}

public:
Foo() : m_complex_str(std::move(create_complex_str())) { }
};

这是正确的做法吗?

也许大多数编译器会在没有 move 功能的情况下为我做这件事?

最佳答案

是的,它会被正确 move ,因为 std::string构造函数支持 std::move , create_complex_str() 的返回值是一个纯右值,可以安全地move 'd。事实上,std::move即使您自己不这样做,也会自动调用(设置断点并查看)-除非可以执行进一步的优化。但是如果你调用std::move你自己,你可能会阻止编译器通过复制省略/RVO 等进一步优化。

The compiler will eliminate unnecessary copies在适用的情况下为您服务。只需编写您的代码(不要成为早期优化的牺牲品!)以让编译器清楚地知道您的代码应该具有什么逻辑结果的方式来执行您希望它执行的操作,然后让它担心优化。所有编译器都针对此类情况进行了大量研究、记录和优化。

如果将来您需要更高性能的代码,您应该首先分析并准确找到瓶颈所在(通常不是您认为可能是瓶颈的地方),然后且仅此而已然后着手使用 hackery 让它更快/更好地工作。

关于c++ - 我可以在函数的结果上使用 std::move 来构造一个新对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14804554/

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