[英]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將為您啟動並刪除副本,而無需支付額外動態分配和管理該內存的成本。
現在針對一組字符的具體問題,最好不要使用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個字符,這是集合中幾個節點的成本。
std::set
是一個容器,這意味着您可以毫無問題地返回它,因此您可以將您的第一個提案修改為:
set<char> createSet1(){
set<char> s;
//does something with s
return s;
}
希望這可以幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.