2015-04-30 33 views
1

實例化矢量 我在我的代碼中的熱點,我需要調用庫函數,需要一個 vector<char> vec和我有數據爲 char* datasize_t len長度一起。我目前這樣做: 有效地從字符*

vec.reserve(len); 
std::copy(data, data+len, back_inserter(vec)); 

和我說的這是一個熱點。我不知道一次複製一個字節是否太慢,並且在每次迭代中複製4或8個字節會更快。我也不知道有這種方式來填充矢量(因爲它需要寫入它的data()成員)。

有沒有辦法,也許,以避免完全複製?

+0

我期望std :: copy是有效的,即對於字符數組而言,只有具有CPU特定ASM的memcpy可能會在內部使用。但是完全避免拷貝當然更好;) –

+0

考慮重新設計這個庫函數的接口;只接受向量很弱 –

+0

該庫提供的功能類似於Google的協議緩衝區。數據根據模式存儲,然後可以序列化。數據作爲std :: vector存儲在內存中。 – ytoledano

回答

0

這產生一個新的臨時(匿名)矢量與內容data對象並替換VEC與此內容。

確保在部署之前使用其他替代方法進行配置。也要問自己,以確保您使用std::vector而不是std::string或其他東西。


甲哈克的方式將是:

vec.resize(len); 
std::memcpy(&vec[0], data, len); // include <cstring> 

memcpy將可能多個字節同時使用本機彙編指令複製並應更快。

+1

這不涉及相同的線性副本嗎? – alcedine

+0

使用其他方法,例如'std :: vector :: resize' +'std :: memcpy'似乎很難。 –

+0

我會做一些測試,看看有多少改善,但我可能會跟哈克一起去。謝謝。 – ytoledano

8

你可以做

vec.assign(data, data + len); 

或者,如果它是一個新的變量,使用適當的構造函數:

std::vector<char> vec(data, data + len); 

應該多一點效率比push_back()一個接一個(雖然輪廓它),但無論如何它是一個副本。

除非您從一開始就使用vector<char>作爲數據,或者更改庫代碼,否則無法避免複製。

至少,您可以在調用庫之間重複使用vec(通過調用assign),這樣可以節省一些內存分配時間。