簡體   English   中英

使用vector有什么好處<char>作為字符數組的輸入緩沖區?

[英]What is the advantage of using vector<char> as input buffer over char array?

我正在從事網絡編程,我看到人們使用向量作為套接字而不是字符數組的輸入緩沖區。

我想知道這樣做的好處是什么。

提前致謝..

vector<char>本質上只是一個托管字符數組。

所以你可以寫:

{
    vector<char> buf(4096);
    ...
    int result = recv(fd, &buf[received_so_far], buf.size() - received_so_far);
    ...
}

向量“知道”它的大小,所以你可以在任何地方使用buf.size()而不必擔心溢出你的緩沖區。 您還可以更改聲明中的大小並使其在任何地方生效,而不會出現任何混亂的#defines。

buf這種使用將在堆上分配底層數組,並且當buf超出范圍時它會自動釋放它,無論這種情況如何發生(例如異常或提前返回)。 因此,您可以獲得堆棧分配的良好語義,同時仍將大對象保留在堆上。

您可以使用buf.swap()非常有效地將底層字符數組的所有權“交給另一個vector<char> (這對於網絡流量來說是一個好主意......現代網絡速度很快。你最不想做的就是為你從網絡接收到的每個字節創建另一個副本。)而且你仍然不必擔心顯式釋放內存。

對於這個特定的應用程序,這些是我腦海中浮現的巨大優勢。

使用向量是:

  • 容易成長的記憶空間。
  • 易於復制數據。
  • 容易免費。

我的主要原因:

  • 它的異常安全。
    • 無論出現什么問題,向量都不會泄漏內存。

vector可以輕松調整大小並允許方便地部分刪除數據 - 這是一個很大的優勢。 在許多情況下,使用固定大小的數組是不方便的——例如,您將讀取數據塊並以小於接收塊的塊處理接收到的數據。 然后您想知道剩余的實際數據量 - 這將是vector.size()並且您不必將其存儲在單獨的變量中,當您刪除部分數據時, vector將為您移動剩余的數據。

如果您曾經用 Java 編寫過網絡應用程序,那么您可能會熟悉ByteBufferIoBuffer 這兩個類通過非常簡單直觀的界面使緩沖區處理變得更加容易。

在 C++ 的世界里,非常幸運的是,有了標准的 vector 類,這兩個類提供的一切都是你可以使用的。 由於vector可以動態增長,所以它比ByteBuffer和IoBuffer更強大。 只需編寫您的代碼,您就會發現您在字節緩沖區包裝器中所期望的一切都在那里。

一些明顯的優勢:

  • 使用 vector::reserve 預分配內存
  • 使用 vector::size 記住緩沖區位置
  • 使用 vector::resize 增長/清除緩沖區
  • 使用 &your_vector[0] 轉換為 C 緩沖區
  • 使用 vector::swap 傳輸緩沖區所有權
  • ……還有更多待發現。

std::vector<char> buffer(SIZE)std::array<char, SIZE> buffer之間的主要區別之一是SIZE參數的位置:對於vector ,您只需要在運行時知道大小,您就可以如果需要,甚至可以更改大小。 對於arraySIZE是一個模板參數,所以你需要在編譯時就知道它,並且在你重新編譯之前它會保持固定。 因此,基本上std::array只是 C 樣式數組char buffer[SIZE]的包裝器。 從 C++14 標准開始,C 風格的數組可以在 C++ 中動態調整大小,而std::array始終是靜態大小。 但是,請注意,C 樣式數組通常在堆棧上分配,並且在大多數實現中堆棧空間是有限的。

下一個區別是, std::vector對其元素執行值初始化,這通常意味着將它們設置為零(除非您使用自定義構造函數覆蓋它),而std::array和 C 樣式數組保留其內容未初始化。

所以:

  • 如果您需要一個已知固定大小的緩沖區,如果該大小不超過幾千字節,並且該緩沖區的內容將由應用程序正確寫入,請使用std::array或 C 樣式數組。 這是更快的解決方案。
  • 否則,使用std::vector 這是更安全的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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