2016-11-17 26 views
-1

如果必須爲向量賦值char數組,首先保留向量大小然後賦值給它是好習慣嗎?向量複製然後賦值可以提高性能

這會提高性能嗎?編譯器不需要分配幾次internaly所以它應該提高性能,但我不知道。編譯器不需要分配幾次內部所以它應該提高性能,但我不確定。 分配前是否已經考慮到這一點?

doese assign(reserve)先分配大小再插入/複製?

注: - 附分配我的意思是在向量分配函數(的std ::矢量::分配)

例如: -

void test_func(char* bigarray) 
{ 
    std::vector<char> v_data; 
    int len=strlen(bigarray); 
    v_data.reserve(len); 
    v_data.assign(bigarray,bigarray+len); 
} 
+5

請發佈您使用的代碼 –

+0

謝謝。我加了代碼,現在問題更加清楚 –

回答

1

我不知道爲什麼這個問題得到downvoted因爲它似乎完全合法有人問這個,而不是去客場和發明某種方式基準載體,其可能會或可能不會給出錯誤的結果。

反正......如果你已經得到了你要分配給矢量體面大小的數組,它幾乎肯定會分配之前更快地保留()。但是,有幾個警告意味着它可能並非總是如此。事實上,它可能會取決於實施。

創建時,您的矢量將具有預定義的大小,所以當執行assign()時,它將開始將數組元素複製到矢量中。當矢量達到其容量時,它會進行另一次分配(我認爲是1.5倍或2倍分配策略),並將這些元素從一個矢量複製到另一個矢量。然而,這種分配可以實際上擴展內存(視操作系統是否會允許它),這個複製操作可能不會發生。你無法預測這一點,因爲這根本不在你的控制之下。

如果輸入數組大小已知的,那麼它通常會得到更好的保留(),你需要提前的空間,以避免這些可能的重新分配/複製操作。然而,你可以比這更好地進行一個階段。 vector構造函數接受一個參數,該參數允許您在實例化時指定大小。這將避免首先保留()的需要。 (請注意,您需要了解resize()和reserve()之間的區別,一個隻影響容量,另一個創建指定大小的向量)

您確實需要了解如果創建一個指定大小的矢量,那麼矢量的大小()將會是這個大小,即使插入的元素少得多。 (您將使用operator []的訪問,插入你的元素)

另一個問題你應該問自己的是:如果你有一個包含數組中的數據,什麼是移動它的目的成一個動態的容器,你真的需要嗎?

+0

。 \t 這可能是我的錯。問題沒有適當的框架,重新編寫它(編輯它)。 –

+0

您可以命名一個平臺,向量可以擴展其分配,並避免在元素容量增加時複製元素? –

4

是。

也許吧。

也許吧。

測試一下,看看。

+0

「號」從列表中缺失。 –

+0

對於所問的問題,*保留*和分配可能是UB。 – krzaq

+1

@krzaq:如果使用'assign()'成員函數,則不行。 –