標籤:

微軟vector類中resize函數的實現對比linux是不是不夠好?

這是微軟的(vs2010)

這是linux下的

如果vector存儲的對象需要結構對齊的話,windows下的vector就會出問題,並且按值傳遞還增加拷貝的消耗。


你兩個resize都不是同一個函數,怎麼對比出來的

我替你截一下vs2017的resize

既然你用的vs2010的STL,那你的linux是不是也應該換到2010年的libstdc++版本呢?

正面回答一下問題:

看好,第一個T value傳值的版本是Until C++11的,而你正好用的是vs2010,那個時候還沒有C++11標準


@孫明琦 的答案就是正確答案了。拿一個C++98的resize和C++11的比,當然不同了。

這裡補充一點,題目本身有錯。這不是linux的resize,而是libstdc++的。即便是在Windows上,也是那樣的代碼。

void resize(size_type __new_size, const value_type __x)
{
if (__new_size &> size())
_M_fill_insert(end(), __new_size - size(), __x);
else if (__new_size &< size()) _M_erase_at_end(this-&>_M_impl._M_start + __new_size);
}


沒有問題啊!關結構對齊什麼事啊(調用和被調用的代碼都是同一個編譯器替你生成的,棧上的參數的分配地址本身就是有對齊的基本粒度單位),本來就是模板,即時編譯的(注意 stl 是等待實例化的代碼模板,是要餵給編譯器的,而不是編譯好的二進位可運行庫)。

你要說傳對象比傳引用(指針)效率低,那是確實低一些。這是對大尺寸的實例對象而言的。對 int, 指針,小尺寸的數據結構是沒太大影響的。

你說的這個函數裡面的參數都是指數組的包含元素的個數,和元素具體類型,元素自身尺寸大小毫無關係。stl 主要幫你完成自動的內存管理(你只需要關心和維護持有的容器對象就夠了),至於你存入容器的東西是什麼,是 int 或 指針,字元串對象,數據結構,實例對象,它完全不 care ,對模板類來說只是抽象類型(當然你還得知道容器內的元素實際上是值類型語意,你要給它們定義諸如比較大小,賦值的操作符,因此你不應該向容器中存入臨時對象的地址,這可能造成元素的生命周期比容器還要短)。如果你要跨模塊,平台傳遞元素,包括和磁碟上的文件交互,那麼元素對齊本來就是你要通過定義來保證的,你要保證你用來傳遞的數據結構在不同模塊之間,不同平台之間無歧義。


於是今年是2017年,你為什麼要拿VS2010的STL實現說事……


大概你傳需要對齊的東西不就是

:XXX警告?


推薦閱讀:

**p[] 和*(*p)[] 有什麼區別?
C語言和C++的基礎知識區別大嗎?
為什麼這段 c++ 代碼需要加這對括弧才正確運行,是編譯器問題嗎?

TAG:C | VisualC |