C/C++中結構Struct和Class的區別,內存分配中的各種區別

C/C++的Struct中也有構造函數和析構函數等,其餘Class的區別如下:

  • 如果從空間分配上來看,struct變量放在棧上,而class變量放在堆上,因此struct變量會自動釋放,而class變量需要手動釋放。
  • c不是面向對象的語言,沒有繼承等概念。
  • struct默認成員類型是public,class默認成員類型是private。

補充一下內存分配的知識點,如下:

1.內存分配

分爲以下幾個部分:

  • 棧區(stack):由編譯器自動分配與釋放,存放爲運行時函數分配的局部變量、函數參數、返回數據、返回地址等。其操作類似於數據結構中的棧。
  • 堆區(heap):一般由程序員自動分配,如果程序員沒有釋放,程序結束時可能有系統回收。
  • 全局區(靜態區static):存放全局變量、靜態數據、常量。程序結束後由系統釋放。全局區分爲已初始化全局區(data)和未初始化全局區(bss)。
  • 常量區(文字常量區):存放常量字符串,程序結束後有系統釋放。
  • 代碼區:存放函數體(類成員函數和全局區)的二進制代碼。
  • 這裏寫圖片描述

2.堆和棧的區別

  • 管理方式不同:棧是由編譯器自動申請和釋放空間,堆是需要程序員手動申請和釋放;
  • 空間大小不同:棧的空間是有限的,堆的空間很大,最大可以到4G;
  • 能否產生碎片:棧和數據結構中的棧原理相同,在彈出一個元素之前,上一個已經彈出了,不會產生碎片,內存分配函數造成內存碎片很多;
  • 生長方向不同:如上圖所示,堆生長方向是向上的,也就是向着內存地址增加的方向,棧剛好相反,向着內存減小的方向生長。
  • 分配方式不同:堆都是動態分配的,動態分配由 malloc 、new函數進行分配。靜態分配是編譯器完成的,比如局部變量的分配,它的動態分配是由編譯器進行釋放,無需我們手工實現。
  • 分配效率不同:棧的效率比堆高很多。棧是機器系統提供的數據結構,計算機在底層提供棧的支持,分配專門的寄存器來存放棧的地址,壓棧出棧都有相應的指令,因此比較快。堆是由庫函數提供的,機制很複雜,庫函數會按照一定的算法進行搜索內存,因此比較慢。

3.C/C++動態內存管理malloc/new、free/delete的異同

  • malloc/free是C/C++標準庫的函數,new/delete是C++操作符。
  • 申請內存位置不同

    new操作符是從自由存儲區上爲對象動態分配內存空間的,malloc函數是從堆上動態分配內存。自由存儲區是C++基於new操作符的一個抽象概念, 凡是通過new操作符進行內存申請的, 該內存稱爲自由存儲區。 而自由存儲區的位置取決於operator new的實現細節。自由存儲區不僅可以是堆, 也可以是靜態存儲區, 取決operator new在哪裏爲對象分配內存。

  • 返回值類型不同

      new操作符內存分配成功時, 返回的是對應的對象類型的指針,int *p = int new,而malloc返回的是void*指針, 需要通過強轉才能轉成我們所需要的類型。

  • 內存大小不同

     malloc/free需要用sizeof()手動計算內存大小,而new/delete編譯器可以自己計算類型大小。

  • 內存分配失敗時的返回值

     new內存分配失敗時會直接拋bac_alloc異常, 它不會返NULL, malloc分配內存失敗時返回NULL。

  • malloc/free只是動態分配內存空間/釋放空間。而new/delete除了分配空間還會調用構造函數和析構函數進行初始化與析構

具體區別是:new分配內存時,先調用malloc後調用構造函數,釋放空間時,先調用析構函數,後調用free。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章