第二部分 vector和string

2021-06-20 00:29:19 字數 1530 閱讀 6664

當你決定用new來分配記憶體時,將承擔以下責任:

n  你必須確保以後會有人呼叫delete來刪除所分配的記憶體,否則將導致資源洩露。

n  你必須確保呼叫了正確的delete形式。比如單個物件呼叫delete;分配了陣列,則呼叫delete。

n  你必須確保只delete了一次。如果一次分配被多次delete,結果也是不確定的。

如果使用vector和string,則可以減少以上的擔憂。

如果你使用的string是以引用計數來實現的,而又在多執行緒的環境中,可以考慮以下幾種做法:

n  檢查庫實現,看看是否可以禁止引用計數。這種方法不可移植。

n  尋找或開發乙個不適用引用計數的string實現。

n  考慮使用vector而不是string,會丟失使用string的成員函式的機會,但可以通過stl演算法實現。

vector和的string的自動增長是這樣實現的:

n  當容器容量不足時,分配一塊大小為當前容量

+max

(當前容量,新增容量) 的新記憶體。大多數時候,都是每次以2的倍數增長,即容量需要擴張時,它們的容量加倍。

n  把容器的所有元素從舊的記憶體複製到新的記憶體。

n  析構掉舊記憶體中的物件

n  釋放舊記憶體

因此,容器的自動增長是會很耗時的。使用reserve能避免容器不必要的重複分配。主要有兩種方式:

n  若能確切知道或大概預計容器中最終會有多少元素,則可以使用reserve。

n  先預留足夠大的空間,然後,當把所有資料都加入以後,去除多餘的容量。可以考慮使用「swap技巧「(見17條)。

幾乎每個string實現都包含以下資訊:

n  字串的大小

n  用於儲存該字元中的字元的記憶體的容量

n  字串的值

n  它的分配子的乙個拷貝,這個欄位是可選的

n  對數的引用計數。

n  string的值可能會被引用計數

n  string物件大小的範圍可以是乙個char*指標的大小的1-7倍

n  建立乙個新的字串值可能需要零次,一次或兩次動態分配記憶體

n  string物件可能共享,也可能不共享其大小和容量資訊。

n  string可能支援,也可能不支援針對單個物件的分配子

n  不同的實現對字元記憶體的最小分配單位有不同的策略。

其實stl也有很多實現版本,每個版本的string實現都是不太一樣的。以後會再找乙個string實現原始碼具體分析。

vector和string的資料傳送到舊api方式:

n  vector保證和陣列具有同樣的布局,可以直接把vector中的資料當做陣列來對待。&v[0]即陣列的首位址指標。反之亦然,可以將陣列元素直接複製到vector的記憶體位址。

n  string提供c_str()函式來返回乙個指向字串的值的指標,且可用於c。因為string中的資料不一定是儲存在連續的記憶體中,而且不一定以空字元結尾。所以不能隨便修改指標指向記憶體的值,特意用顯式呼叫作為提醒。

n  對於其他型別的stl容器,可以將資料先拷貝到vector,用vector作為中介與舊api相互傳送資料

Web API 第二部分

web api 第二部分 元素偏移量 offset element.offsettop element.offsetleft element.offsetwidth 可以得到元素的大小 寬度和高度 是包含padding border width element.offsetheight elemen...

redux 第二部分

redux 的使用方法,為什麼使用 action.js 檔案,進行優化 將其分開,然後我們通過工廠函式的每次返回不同的物件,由於引數是固定的,每次返回的都是事件型別和事件資料,所以我們可以使用乙個函式,通過其返回值來返回乙個物件,讓後傳遞給 action 我們的 reducer 函式有兩個引數,引數...

實驗二 第二部分

第二部分 ftp協議分析 1.兩個同學一組,a和b。2.在a主機上架設ftp伺服器 3.在b主機上執行wireshark,並登陸a主機的ftp伺服器,上傳一張,得到抓取的資料報,4.進行追蹤tcp流,顯示為原始資料,分析得到a主機登陸ftp的過程及使用者名稱密碼,還原上傳的,第二部分 ftp協議分析...