一、demo
#include #include#include
//c語言中所有的區域性變數都在棧區
char *get_str_wrong()
char *get_str_right()
intmain()
c語言中,記憶體分配方法有2種:
python語言中:所有的物件都在堆區申請記憶體
python 沒有c語言省記憶體
分配記憶體:
底層原始碼與分配記憶體相關的函式有:
pyobject* _pyobject_new(pytypeobject *type);
void* pymem_rawrealloc(void *p, size_t n);
void* pymem_rawcalloc(size_t nelem, size_t elsize);
type* pymem_new(type, size_t n);
……分配記憶體 全部都是在堆中分配的。
堆記憶體的特點(分配後,只能手動銷毀) (ps: 棧記憶體的特點,出了作用域自動銷毀)
在python中,python直譯器負責銷毀
引用計數:cpython中有個結構體,裡面有個字段專門用來存計數值
classmyclass(object):
pass
deff(obj):
#print(sys.getrefcount(obj))
pass
defrefcount_test():
obj =myclass()
x =obj
delx
y =obj
f(obj)
(sys.getrefcount(obj))
if__name__ == '
__main__':
refcount_test()
垃圾**:
引用計數為0時,垃圾**。python直譯器負責
底層原始碼與垃圾**相關的函式有:
void pymem_del(void *p);
void pyobject_del(void *op);
void pymem_rawfree(void *p);
堆記憶體分配在cpython 中的應用:
在 python 中,記憶體管理涉及到乙個包含所有 python 物件和資料結構的私有堆(heap),這個私有堆的管理由內部的 python 記憶體管理器(python memorymanager) 負責。
在最底層,乙個原始記憶體分配器通過與作業系統的記憶體管理器互動,確保私有堆中有足夠的空間來儲存所有與 python 相關的資料。
記憶體分配器根據每種物件型別的特點實現不同的記憶體管理策略。
python 堆記憶體的管理是由直譯器來執行,使用者對它沒有控制權。
先看幾個從cpython 原始碼中的函式:
void* pymem_rawrealloc(void *p, size_t n); //將 *p* 指向的記憶體塊大小調整為 *n* 位元組。
void* pymem_rawcalloc(size_t nelem, size_t elsize); //
分配 nelem 個元素,每個元素的大小為 elsize 位元組
void* pymem_rawmalloc(size_t n); //
分配 n 個位元組,並返回乙個指向分配的記憶體的 void* 型別指標
void pymem_rawfree(void *p); //
釋放 p 指向的記憶體塊。
type* pymem_new(type, size_t n); //
與 pymem_malloc() 相同,但分配 (n* sizeof(type)) 位元組的記憶體,返回乙個轉換為 type* 的指標
type* pymem_resize(void *p, type, size_t n); //
與 pymem_realloc() 相同,但記憶體塊的大小被調整為 (n * sizeof(type)) 位元組
void pymem_del(void *p); //
與 pymem_free() 相同
物件的建立和銷毀:
type* pyobject_new(type, pytypeobject *type); //使用 c 結構型別 type和 python 型別物件 type 分配乙個新的 python 物件。
void pyobject_del(void *op); //
釋放記憶體
pyobject* pyobject_init(pyobject *op, pytypeobject *type); //return value: borrowed reference.
pyobject* _pyobject_new(pytypeobject *type); //
return value: new reference.
pyobject_init 使用其型別和初始引用初始化新分配的物件操作。返回初始化的物件。new建立好的,然後進行初始化
pyobject_new 使用c結構型別型別和python型別物件型別分配乙個新的python物件。原創
再看乙個物件分配器:
pymalloc //預設記憶體分配器,為小物件(小於或等於 512 位元組), 它使用固定大小為256 kib 的稱為 "arenas" 的記憶體對映
pymem_rawmalloc() 或 pymem_rawrealloc() //
大於512位元組的分配,剛開始創
建用pymem_rawmalloc(),動態擴容用pymem_rawrealloc()
python和c語言分配記憶體的關係:
pymalloc 分配器使用如下函式:
virtualalloc() :win32函式,預定指定位址和大小的虛擬記憶體空間。假如我們的程式要使用5 - mb記憶體塊,但並不是要馬上全部使用,則我們可以呼叫virtualalloc 函式
virtualfree() :釋放virtualalloc() 分配的記憶體
malloc() :c語言的記憶體分配函式,內部其實呼叫的是heapalloc 函式, heapalloc 函式是windows提供的api,在程序初始化的時候,系統會在程序的位址空間中建立1 m大小的堆,稱為預設堆(default heap)
free() :釋放malloc() 分配的記憶體
mmap() 和 munmap() :linux系統中的記憶體分配和釋放函式。
在python中,為什麼int型別是28個位元組?
importsysx = 8 #
值:8 型別:int 引用:1
print(type(1)) #
print(sys.getsizeof(1)) #
28
typedef struct pyintobject
思考:c語言 棧空間 和 堆空間 的區別?棧區 堆區 **區 靜態區
記憶體管理 記憶體管理概述
儲存器的發展方向是高速 大容量和小體積,即儲存器嘗試更高讀寫速度,更大儲存容量,更小物理體積。在計算機中,常見的儲存器有 暫存器,快取,記憶體,硬碟,一般硬碟之類的輔助儲存器又稱外存。在平均讀寫速度上,有 暫存器 快取 記憶體 外存 在單位容量 上,有 外存 記憶體 快取 暫存器 cpu處理器只能直...
九 oc中多物件記憶體管理基礎學習
windows phone 7手機開發 ios培訓 期待與您交流!首先,我們的得知道如何關閉arc機制,新版的xcode與老版本的關閉,操作上有所不同。不僅僅如此,開啟arc後我們還需要開啟殭屍物件檢測功能,殭屍物件是指,當物件的內部引用計數器已經被清零了,那麼這個物件的記憶體空間會被 那麼這個物件...
黑馬程式設計師 Object C基礎 九 記憶體管理
管理範圍 任何繼承了 nsobject 的物件,對其他基本資料型別 int char float double struct enum等 無效 只要你呼叫了retain,無論這個物件是如何生成的,你都要呼叫release void setbook book book void dealloc 使用場...