c返回指针与使用std :: move返回本地对象
发布时间:2020-12-16 09:48:50 所属栏目:百科 来源:网络整理
导读:我必须创建一个为我创建一组字符的函数.我不确定我应该选择以下哪种方法. 据我所知,我不应该使用createSet1,因为如果在返回s之前出现问题,它将会泄漏. setchar* createSet1(){ setchar* s = new setchar; //does something return s;}setchar createSet2(){
我必须创建一个为我创建一组字符的函数.我不确定我应该选择以下哪种方法.
据我所知,我不应该使用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将为您启动并删除副本,而无需支付额外动态分配和管理该内存的成本. 现在针对一组字符的具体问题,最好不要使用set,而是正确调整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< char>避免std :: vector< bool>的怪癖它将是256个字符,这是集合中几个节点的成本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |