九 記憶體管理

2022-07-10 21:21:07 字數 3704 閱讀 8858

一、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中有個結構體,裡面有個字段專門用來存計數值

class

myclass(object):

pass

deff(obj):

#print(sys.getrefcount(obj))

pass

defrefcount_test():

obj =myclass()

x =obj

delx

y =obj

f(obj)

print

(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個位元組?

import

sysx = 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 使用場...