[英]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 編寫過網絡應用程序,那么您可能會熟悉ByteBuffer和IoBuffer 。 這兩個類通過非常簡單直觀的界面使緩沖區處理變得更加容易。
在 C++ 的世界里,非常幸運的是,有了標准的 vector 類,這兩個類提供的一切都是你可以使用的。 由於vector可以動態增長,所以它比ByteBuffer和IoBuffer更強大。 只需編寫您的代碼,您就會發現您在字節緩沖區包裝器中所期望的一切都在那里。
一些明顯的優勢:
std::vector<char> buffer(SIZE)
和std::array<char, SIZE> buffer
之間的主要區別之一是SIZE
參數的位置:對於vector
,您只需要在運行時知道大小,您就可以如果需要,甚至可以更改大小。 對於array
, SIZE
是一個模板參數,所以你需要在編譯時就知道它,並且在你重新編譯之前它會保持固定。 因此,基本上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.