2017-02-13 104 views
2

注意:在我的應用程序中,性能非常關鍵! 爲最壞的情況分配足夠的緩衝區存儲是避免重新分配的要求。我應該使用std :: vector +我自己的size變量嗎?

看看這個,這是怎麼了,我通常使用std ::向量:

//On startup... 
unsigned int currVectorSize = 0u; 
std::vector<MyStruct> myStructs; 
myStructs.resize(...); //Allocate for the worst case scenario! 

//Each frame, do this. 
currVectorSize = 0u; //Reset vector, very fast. 

run algorithm... 
//insert X elements in myStructs if condition is met 
myStructs[currVectorSize].member0 = ; 
myStructs[currVectorSize].member1 = ; 
myStructs[currVectorSize].member2 = ; 
currVectorSize++; 

run another algorithm... 
//insert X elements in myStructs if condition is met 
myStructs[currVectorSize].member0 = ; 
myStructs[currVectorSize].member1 = ; 
myStructs[currVectorSize].member2 = ; 
currVectorSize++; 

Another part of the application uses myStructs and currVectorSize 

我有一個決策問題,我應該使用std ::矢量+調整+我自己的尺寸可變或std :: vector + reserve + push_back + clear + size?

我不喜歡讓另一個大小變量浮動,但clear()函數很慢(線性時間)並且push_back函數具有邊界檢查的開銷。我需要在每幀不變的時間重置大小變量,而不調用任何析構函數並以線性時間運行。 結論:我不想破壞我的舊數據,我只需要在每一幀重置當前大小/當前數字插入的元素變量。

+3

'清除()'應該是恆定的時間,如果你的對象是微不足道的。這聽起來像你已經知道什麼是最高性能的(儘管一定要對它進行描述!),所以如果你爲速度/性能進行優化,你已經知道你的答案是什麼。 – Cornstalks

+0

好的,我想這是針對這個特定情況的最好方法。關於清除功能:是的,它應該是POD類型不變的,但不同的編譯器......你不知道...... – karl88

回答

0

如果表現很關鍵,那麼也許你應該只是簡介你所能做的一切。

如果您可以確保事先不需要重新分配(這是您的操作 - 在沒有檢查的情況下遞增currVectorSize),但是在這種情況下,爲什麼要使用std::vector?只需使用數組或std::array

否則(如果重新分配可能發生),你仍然需要比較你的尺寸變量和實際的向量大小,所以這將是幾乎相同的東西push_back會做什麼,並會帶來什麼。

還有一些vectorfolly::fbvector一些調整/優化的實現,但你應該仔細考慮(並再次,配置文件)是否需要類似的東西。

至於清除矢量,請查看vector::resize - 如果您調整大小(由於迭代器失效),實際上可以保證不重新分配。所以你可以打電話resize(0)而不是clear只是爲了確保。

+0

是的,重新分配將永遠不會發生在我的應用程序中。我可能會使用std :: array而不是std :: vector,感謝您的建議。 – karl88

相關問題