2012-12-03 70 views
0

我很好奇,編譯器會多少優化做的,所以......優化期望在STL

// assume we have this declared somewhere 
std::vector<int> vec; 

// my question is, when fully optimized will this... 
for (int i(0); i<100; ++i) 
    vec.push_back(i); 

// evaluate to this? psuedo code... 
const size_t size = size(); 
const size_t newsize = size + 100; 
if (size < vec.capacity()) 
    vec.exponentialGrowth(); 
vec.setSize(newsize); 
for (size_t i(size); i<newsize; ++i) 
    vector[i] = i; 

我與Visual Studio Express的2012工作已啓用優化。 我試過看反彙編,但優化使其難以閱讀。

+0

回覆:「我試過看反彙編,但優化使其難以閱讀。」這可能意味着優化器在優化方面做得很好。 :-P更嚴重的一點是,我認爲您所提供的代碼不會像這樣優化,除非優化器的技術狀態最近接近了神奇的優化級別。 –

+0

可能不是。如果你知道目標大小,使用'resize'(或'reserve')。同時,請注意平均拷貝數接近上限(如果內存服務的話,大多數實現方式都是3左右),所以即使在最壞的情況下,它也不像許多人最初想象的那麼大。 –

+0

而不是使用int作爲模板參數,請使用用戶定義的類。儀器不同的構造函數,看看會發生什麼。 – user515430

回答

2

查看VS 2012生成的程序集與指定的/Ox選項,編譯器不會優化爲一次性保留所有100個元素的容量。

它增加了一個接一個的元素,當需要額外的空間時,將矢量的容量增加50%。載體的容量從0開始,然後生長像這樣:

1, 2, 3, 4, 6, 9, 13, 19, 28, 42, 63, 94, 141 

GCC 4.7.2與-O2行爲類似,但通過倍增能力,而不是由50%生長增長。

0

無論編譯器優化是否開啓,std::vector都將按指數規模調整大小。

如果您擔心調整性能(並且不能提前預留足夠的空間),請考慮使用std::deque。引用Herb Sutter「與傳染媒介相比,Deque更容易使用,並且本質上更有效地促進增長。」

+0

我在代碼中使用了exponentialGrowth(),因爲我認爲保留將只分配要求的內容,而如果優化只是將調整大小檢查移出循環,它幾乎肯定會成指數增長。這並不代表指數增長不足以增長的情況,但最終問題是關於優化預期。 – Histuries

+0

@Histuries'push_back'會使'vector'呈指數級增長,我懷疑編譯器是否足夠聰明以理解'push_back'調用的數量和所需的最終內存之​​間的連接。這是一個猜測,但是一個受過教育的人:編譯器根本不會在這個抽象層次上運行。畢竟,檢查很容易:只要閱讀容量文件,並且不打開優化條件,如果存在差異,我就錯了。 –