[UE4]C++創建對象的三種方式


#include <iostream> 
using namespace std; 
class A 
{ 
private: 
    int n; 
public: 
    A(int m):n(m) 
    { } 
    ~A(){} 
}; 
int main() 
{ 
    A a(1);  //棧中分配 
    A b = A(1);  //棧中分配 
    A* c = new A(1);  //堆中分配 
  delete c; 
    return 0; 
} 

第一種和第二種沒什么區別,一個隱式調用,一個顯式調用,兩者都是在進程虛擬地址空間中的棧中分配內存,而第三種使用了new,在堆中分配了內存,而棧中內存的分配和釋放是由系統管理,而堆中內存的分配和釋放必須由程序員手動釋放。采用第三種方式時,必須注意一下幾點問題:

  1. new創建類對象需要指針接收,一處初始化,多處使用
  2. new創建類對象使用完需delete銷毀
  3. new創建對象直接使用堆空間,而局部不用new定義類對象則使用棧空間
  4. new對象指針用途廣泛,比如作為函數返回值、函數參數等
  5. 頻繁調用場合並不適合new,就像new申請和釋放內存一樣
  6. 棧的大小遠小於堆的大
  7. 棧是機器系統提供的數據結構,計算機會在底層對棧提供支持:分配專門的寄存器存放棧的地址,壓棧出棧都有專門的指令執行,這就決定了棧的效率 比較高。堆則是C/C++函數庫提供的,它的機制是很復雜的,例如為了分配一塊內存,庫函數會按照一定的算法(具體的算法可以參考數據結構/操作系統)在 堆內存中搜索可用的足夠大小的空間,如果沒有足夠大小的空間(可能是由於內存碎片太多),就有可能調用系統功能去增加程序數據段的內存空間,這樣就有機會 分 到足夠大小的內存,然后進行返回。顯然,堆的效率比棧要低得多


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM