C++ 返回指针与返回带有 std::move 的本地对象
c++ return pointer vs. return a local object with std::move
我必须创建一个函数来为我创建一组字符。我不确定我应该选择以下哪种方法。据我了解,我不应该使用 createSet1,因为如果在返回 s 之前出现问题,它会泄漏。
set<char>* createSet1(){
set<char>* s = new set<char>;
//does something
return s;
}
set<char> createSet2(){
set<char> s;
//does something
return std::move(s);
}
unique_ptr<set<char>> createSet3(){
unique_ptr<set<char>> s(new set<char>);
//does something
return s;
}
如果有人能解释我应该更喜欢哪一个以及为什么,我会很高兴。
以上
都不是:
std::set<char> createSet() {
std::set<char> s;
// do something
return s;
}
没有理由动态分配集,RVO 将为您启动并删除副本,而无需支付该内存的额外动态分配和管理成本。
现在对于一组字符的具体问题,最好不要使用一组字符,而是使用大小正确的std::vector
:
class CharSet {
std::vector<bool> d_data; // std::vector<bool> quirks are fine here
void set(char ch, bool value) {
d_data[static_cast<unsigned char>(ch)] = value;
}
public:
CharSet() : d_data(std::numeric_limits<unsigned char>::max()+1) {}
void set(char ch) { set(ch,true); }
void unset(char ch) { set(ch,false); }
bool isset(char ch) const {
return d_data[static_cast<unsigned char>(ch)];
}
};
这种方法的优点是,您要支付的较高成本是std::set
中节点的动态分配,并且与std::vector
情况下的单次分配相比,每个这样的分配都有成本(对于足够小的向量)。std::vector<bool>
的内存将约为32字节,与64位架构上std::set
中的单个节点相当。您甚至可以将其作为避免std::vector<bool>
怪癖的std::vector<char>
,它将是 256 个字符,这是集合中几个节点的成本。
std::set
是一个容器,这意味着您可以毫无问题地返回它,因此您可以将第一个提案修改为:
set<char> createSet1(){
set<char> s;
//does something with s
return s;
}
希望这有帮助
相关文章:
- 返回一个带有 std::move 的对象并链接函数
- 在返回语句中构造对象时,std::move() 是否有助于或阻止 RVO?
- std::move 返回值 weak_ptr::锁定弄乱了shared_ptr的引用计数?
- 实现move构造函数如何影响返回值优化
- 我应该返回一个右值引用(通过 std::move'ing)吗?
- 为什么将boost::move()的返回值分配给非常数引用在C++0x模式下失败,但在C++03模式下有效
- std::move on std::string 是否保证 .c_str() 返回相同的结果
- 为什么在返回兼容类型时需要显式std::move
- 我应该对返回std::vector的函数使用std::move吗
- 组合 std::forward、std::move 和 voltile 时出现意外的返回类型
- std::move 如何应用于函数返回值
- 在从函数返回值时使用std::move()以避免复制
- move()数据从线程返回
- C++ 返回指针与返回带有 std::move 的本地对象
- 为什么 std::move 会阻止 RVO(返回值优化)
- 通过右值引用传递并使用 std::move() 返回
- 有没有办法使用 move 而不是复制语义将函数返回值(对象)包装在 Python 中
- 为什么这个非常简单的返回 std::move(线程句柄)失败
- 返回std::for_each中的std::move(f)
- 从free函数与member函数返回move-only类型