簡體   English   中英

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將為您啟動並刪除副本,而無需支付額外動態分配和管理該內存的成本。


現在針對一組字符的具體問題,最好不要使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM