2011-08-05 63 views
0

如果我需要一個二進制緩衝區對象,
像用於TCP/UDP通信,
我會基於它,在C++?二進制緩衝區進行通信,C++

  • vector<unsigned char>

  • std::string? - std :: string可以容納0字節,與流行的看法相反,所以它可以用來保存二進制數據。

  • new char[]

  • malloc()

有沒有人看到用於二進制緩衝區的std :: vector?
我沒看見。爲什麼?性能?

而且我確實看到malloc()經常用於二進制緩衝區。
在C++中。任何人都可以證實嗎?解釋一下?

由於

+0

我懷疑答案取決於你想使用什麼緩衝區以及如何使用它。 – forsvarir

+0

使用vector Arunmu

+0

Boost Asio使用/推薦char的向量來存儲二進制數據。所以我認爲它不應該給任何性能問題 – Arunmu

回答

6

二進制緩衝區可以只看作是一塊內存,你預留用於存儲一些非結構化信息。 從這個意義上講,使用新的char[]malloc與IMO完全等價,因爲它們會給你一段內存和一個指向它的指針。

使用std::vector是另一回事;除了成本,這我不認爲是相關的,因爲你會使用

&vect[0] 

訪問底層緩衝區像你將與malloc這樣做,它有它的優勢,如緩衝區可擴展性和更安全的訪問比直指針;您可能會閱讀discussion here。我自己在一個項目中使用過它們。

std::string原則上,C++(98,03)標準的問題不能保證底層緩衝區的連續性,但這似乎不是編譯器實現的問題。 C++ 0x似乎具有標準化的緩衝區連續性(但我沒有具體搜索)。所以你也可以使用它們,但在Herb Sutter's comment here之前閱讀(它不在主要文章正文中,而是在其末尾發佈的第三條評論中)。我想選擇std::vector

0

這取決於你的程序如何工作。是客戶端還是服務器?會發送/接收固定長度的請求嗎?你以後需要修改數據嗎?你想操縱作爲一個字符串或不?

我會使用std :: string,因爲它在這方面是最靈活的。但正如你所看到的,這不是最佳的。

1

newmalloc之間的區別在於new還爲其分配內存的實體調用構造函數(如果有的話)。但是由於char是基本類型,所以使用newmalloc沒有區別,因爲char沒有構造函數。關於deletefree也可以這樣說。

我會親自使用一個char *緩衝區(一個char是內存1個字節):

char* buf = new char[100]; 

還有,記得釋放分配的緩衝區時,使用結構,如:

delete[] buf; 

刪除陣列otherwise you will have memory leaks

個人使用std::stringstd::vector因爲:

  • 字符的簡單數組似乎更快,我
  • 更多的「通用」(有性病,但在幾個實現字節數組將總是相同)
  • 並且它可能更容易理解和調試

HTH,
JP

+0

要挑剔,你*可以* value-構造整型和它的數組(默認爲0),所以'new char [100]()'應該給你一個歸零陣列。不過,對此的支持可能會有所不同。還要注意'new'是一個*表達式*,而'malloc()'是一個*函數*。 –

+0

你關於它更快的觀點值得商榷。速度差異最多可以忽略不計,您可以獲得更好的資源範圍和類型安全性。我認爲處理數組的認知負擔不值得速度「收益」(如果有的話)。 – Pablo

+0

@ Kerrek SB:感謝您的寶貴信息:) –

相關問題