[英]What is the correct way to deal with medium-sized byte arrays in modern C++?
許多語言和框架都提供“字節數組”類型,但 C++ 標准庫沒有。 什么類型適合用於中型1 ,可調整大小的字節 arrays 以及如何有效地使用該類型? (特別是:分配、作為參數傳遞和銷毀)
1:中型是指小於 100 MB。
您可以使用std::vector<unsigned char>
或@Oli 建議的std::vector<uint8_t>
。 是的,您可以繞過它,而無需復制全部內容。
void f(std::vector<unsigned char> & byteArray) //pass by reference : no copy!
{
//
}
std::vector<unsigned char> byteArray;
//...
f(byteArray); //no copying is being made!
許多語言和框架都提供“字節數組”類型,但 C++ 標准庫沒有。
你錯了, C++ 有一個字節數組類型: std::vector<unsigned char>
,它的存儲保證是連續的(如果你不需要這個條件還有其他選擇)。 您可能想閱讀有關引用、移動語義、返回值優化和復制省略的內容,以了解如何有效地處理這些內容。
注意:一個字節,用 C++ 來說,是一個char
(有符號或無符號)。 它可能不是 8 位長,您可以通過CHAR_BITS
宏獲取其大小(以位為單位)。
我建議使用std::deque<uint8_t>
而不是std::vector<uint8_t>
因為后者需要 memory 的連續塊。我會避免使用new
分配 memory 的大塊,因為它將初始化 memory 的塊使用默認構造函數可能比你想要的要貴一點。
在緊要關頭,我相信您可以使用自定義釋放器自定義boost::shared_ptr
,這樣您就可以使用std::malloc
進行分配,避免初始化開銷,並使用std::free
進行釋放,同時仍然保持shared_ptr
帶來的優點.
vector<char>
應該適合您的目的。 如果您希望共享版本避免復制,您可以使用以下內容:
typedef shared_ptr<vector<uint8_t>> ByteArray;
如果您知道編譯時的大小,則可以使用空間效率更高的array
。
string
也可以處理 null 個字符,這可能比 vector 更合適也可能不合適。
一些擴展實現有繩索實現http://en.wikipedia.org/wiki/Rope , http://www.aoc.nrao.edu/php/tjuerges/ALMA/STL/html-3.4.6/rope.html ,這可能更合適。
有使用 unique_ptr 的性能原因,至少對於相對較大的緩沖區。 有關詳細信息,請參閱https://stackoverflow.com/a/35798248/1992615 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.