35、C++ Primer 4th筆記,特殊工具與技術,最佳化記憶體配置(2)

來源:互聯網
上載者:User

9、正如定位new(placement new expression)運算式是使用allocator類的construct成員的低級選擇,可以使用解構函式的顯式調用作為調用destroy函數的低級選擇。

範例程式碼

for (T *p = first_free; p != elements; /*empty*/)alloc.destroy(--p);//上式表達與下式表達等價p->~T();

10、顯式調用解構函式是清除對象本身,並沒有釋放對象所佔的記憶體;調用operator delete函數不會運行解構函式,它只釋放指定的記憶體。

11、類通過定義自己的名為operator new和operator delete的成員,可以管理用於自身類型的記憶體。

編譯器看到類類型(for a class type)的new或delete運算式的時候,它查看該類是否有operator new或operator delete成員,如果類定義(或繼承)了自己的成員new和delete函數,則使用那些函數為對象分配和釋放記憶體;否則使用標準庫版本。

最佳化new和delete的行為的時候,只需要定義operator new和operator delete的新版本,new和delete運算式自己照管對象的構造撤銷。

12、在自訂new和delete的時候,應當成對定義。要用自訂全用,要用全域的也全用全域的。

可以通過全域範圍確定操作符來強制new,delete運算式使用的是全域的庫函數。

範例程式碼

Type *p = ::new Type; //uses global operator new::delete p; //uses global operator delete

13、如果基類有 virtual 解構函式,則傳給 operator delete 的大小將根據被刪除指標所指對象的動態類型而變化;如果基類沒有 virtual 解構函式,那麼,通過基類指標刪除指向衍生類別對象的指標的行為,跟往常一樣是未定義的。

    這些函數(operator new和operator delete)隱式地為靜態函數,不必顯式地將它們聲明為static。成員 new 和 delete 函數必須是靜態,因為它們要麼在構造對象之前使用(operator new),要麼在撤銷對象之後使用(operator delete),因此,這些函數沒有成員資料可操縱。像任意其他靜態成員函數一樣,new 和 delete 只能直接存取所屬類的靜態成員。

14、一個通用策略是預先分配一場原始記憶體來儲存未構造的對象,建立新元素的時候,可以在一個預先分配的對象中構造;釋放元素的時候,將它們放回預先指派至的塊中,而不是將記憶體實際返還給系統。這種策略常被稱為維持一個自由列表。可以將自由列表實現為已指派但未構造的對象的鏈表。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.