當前數據結構
我有一個代碼,其中的數據結構分別由A1
和A2
兩個向量表示。編譯器能夠內聯這種方法嗎?
vector<A1> v1;
vector<A2> v2;
我的代碼的慢部分(總運行時間的約80%)由在遍歷這些載體和上的v2
元件v1
和funA2
元素應用該方法funA1
。
double result = 0;
for (int i = 0 ; i < v1.size() ; i++)
{
results *= v1[i].funA1();
}
for (int i = 0 ; i < v2.size() ; i++)
{
results *= v2[i].funA2();
}
重塑數據結構
雖然數據結構使用這兩個向量,直覺寧願使用,其混合的數據類型A1
和A2
的單個載體。使用兩種不同的載體會在代碼的其他地方帶來可讀性和維護的損失。
我想我可以將它們合併成一個單獨的向量。這個想法是使A1
和A2
兄弟類別的母類A
和使用vector<A> v
作爲單個向量。我會在類A
定義虛擬fun
並覆蓋其在這兩個A1
和A2
這樣我就可以做
double result = 0;
for (int i = 0 ; i < v.size() ; i++)
{
results *= v[i].fun();
}
問題
在第一種情況下,該方法funA1
和funA2
可以通過內聯編譯器(實際上我自己將它們內聯,因爲它們是非常簡單的函數)。
在第二種情況下,恐怕內聯是不可能的。它是否正確?
編譯器是否管理內聯方法fun
?
當然,性能的損失可能可以忽略不計,我應該測試它,但我想知道在嘗試進行所有修改之前是否看起來先驗值得。
如果您擔心可讀性,那麼使用lambda表達式可能會比使用['std :: accumulate'](http://en.cppreference.com/w/cpp/algorithm/accumulate)更好的選擇你的循環? –
請參閱http://stackoverflow.com/a/18432062/2630032 –
您將不得不使用'vector v'。如果你使用'vector v',你有對象切片。 – alain