簡體   English   中英

在現代 C++ 中處理中型字節 arrays 的正確方法是什么?

[英]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.

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