Re: [問題] 在STL容器中增加元素的方法
※ 引述《holymars ()》之銘言:
: 有個STL容器
: std::list<T> my_list;
: 要在容器最後面新增一個元素的時侯,下面兩種方法哪一種比較有效率呢..
: 1.
: T temp;
: // 對temp的內容操作..
: my_list.push_back(temp);
: 2.
: my_list.resize(my_list.size() + 1);
: T& temp = my_list.back();
: // 對temp的內容操作..
: 之前一直習慣的寫法都是1.
: 但是2.的作法好像少呼叫一次copy constructor
: 有人對這兩種作法的效率問題作過實際的測試嗎 @ @?
直覺 2 完全佔不到便宜,
因為 resize 的瞬間你就要呼叫一個預設建構子,
不過還是看一下 VC++ 2008 Express 附的實作版本好了……
void resize(size_type _Newsize)
{ // determine new length, padding with _Ty() elements as needed
resize(_Newsize, _Ty());
}
void resize(size_type _Newsize, _Ty _Val)
{ // determine new length, padding with _Val elements as needed
if (size() < _Newsize)
_Insert_n(end(), _Newsize - size(), _Val);
else if (_Newsize < size())
erase(begin() + _Newsize, end());
}
首先,resize 會呼叫一次預設建構子,
然後,會一兩次條件判斷,第二次不可能發生,所以忽略。
接著會進行一次 insert_n,這裡頭有個迴圈,貴鬆鬆,
雖然我們知道只會插一個,但是迴圈還是得跑,有迴圈就要破壞 pipeline 了,
看了原始碼就知道所謂的 resize 最後該花的錢(建構子)還是得花,
考慮最佳化以後也許一些多餘的複製成本省掉可以打平,
但是那個條件判斷跟那個迴圈你還是要開銷……
結果蠻明顯的……真的要花時間測嗎 XD???
--
To iterate is human, to recurse, divine.
遞迴只應天上有, 凡人該當用迴圈. L. Peter Deutsch
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.110.8
推
09/10 10:39, , 1F
09/10 10:39, 1F
→
09/10 10:40, , 2F
09/10 10:40, 2F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章