成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python引用計數與相關析構函數的實際操作步驟

開發 后端
當Python引用計數減為0的時侯,應該與對象所對應的相關析構函數有時會被調用于Python中,文本就是對Python引用計數在具體應用的相關介紹。

在C或是在C++中,相關人員在實際的操作中是可以自由的運用,但是在某些方面可以說是存在一些罪惡,就這一缺陷,我們可以用Python引用計數在其方面有一個解決的方案,以下是文章的具體介紹。

在權利的面,程序員必須負責將申請的內存釋放,并釋放無效指針。可以說,這一點正是萬惡之源,大量內存泄露和懸空指針的bug由此而生,如黃河泛濫一發不可收拾。

現代的開發語言中一般都選擇由語言本身負責內存的管理和維護,即采用了垃圾收集機制,比如Java和C#。垃圾收集機制使開發人員從維護內存分配和清理的繁重工作中解放出來,但同時也剝奪了程序員與內存親密接觸的機會,并付出了一定的運行效率作為代價。#t#

現在看來,隨著垃圾收集機制的完善,對時間要求不是非常高的程序完全可以通過使用垃圾收集機制的語言來完成,這部分程序占了現存的大多數的程序。這樣做的好處是提高了開發效率,并降低了bug發生的幾率。Python同樣也內建了垃圾收集機制,代替程序員進行繁重的內存管理工作,而引用計數正是Python垃圾收集機制的一部分。

Python通過對一個對象的引用計數的管理來維護對象在內存中的存在與否。我們知道在Python中每一個東西都是一個對象,都有一個ob_refcnt變量。這個變量維護著該對象的引用計數,從而也最終決定著該對象的創建與消亡。

在Python中,主要是通過Py_INCREF(op)和Py_DECREF(op)兩個宏來增加和減少一個對象的Python引用計數。當一個對象的引用計數減少到0之后,Py_DECREF將調用該對象的析構函數來釋放該對象所占有的內存和系統資源。注意這里的“析構函數”借用了C++的詞匯,實際上這個析構動作是通過在對象對應的類型對象中定義的一個函數指針來指定的,就是那個tp_dealloc。

如果熟悉設計模式中的Observer模式,就可以看到,這里隱隱約約透著Observer模式的影子。在ob_refcnt減為0之后,將觸發對象銷毀的事件。從Python的對象體系來看,各個對象提供了不同的事件處理函數,而事件的注冊動作正是在各個對象對應的類型對象中靜態完成的。

PyObject中的ob_refcnt是一個32位的整形變量,這實際蘊含著Python所做的一個假設,即對一個對象的引用不會超過一個整形變量的最大值。一般情況下,如果不是惡意代碼,這個假設顯然是成立的。

需要注意的是,在Python的各種對象中,類型對象是超越引用計數規則的。類型對象“跳出三界外,不再五行中”,永遠不會被析構。每一個對象中指向類型對象的指針不被視為對類型對象的引用。在每一個對象創建的時候,Python提供了一個_Py_NewReference(op)宏來將對象的Python引用計數初始化為1。

在Python的源代碼中可以看到,在不同的編譯選項下(Py_REF_DEBUG, Py_TRACE_ REFS),引用計數的宏還要做許多額外的工作。下面展示的代碼是Python在最終發行時這些宏所對應的實際的代碼:

 

  1. [object.h]  
  2. #define _Py_NewReference(op) ((op)->ob_refcnt = 1)  
  3. #define _Py_Dealloc(op) ((*(op)->ob_type->tp_dealloc)((PyObject *)(op)))  
  4. #define Py_INCREF(op) ((op)->ob_refcnt++)  
  5. #define Py_DECREF(op) \  
  6. if (--(op)->ob_refcnt != 0) \  
  7. ; \  
  8. else \  
  9. _Py_Dealloc((PyObject *)(op))  
  10. /* Macros to use in case the object pointer may be NULL: */  
  11. #define Py_XINCREF(op) if ((op) == NULL) ; else Py_INCREF(op)  
  12. #define Py_XDECREF(op) if ((op) == NULL) ; else Py_DECREF(op)   

 

在一個對象的Python引用計數減為0時,與該對象對應的析構函數就會被調用,但是要特別注意的是,調用析構函數并不意味著最終一定會調用free釋放內存空間,如果真是這樣的話,那頻繁地申請、釋放內存空間會使Python的執行效率大打折扣(更何況Python已經多年背負了人們對其執行效率的不滿)。

一般來說,Python中大量采用了內存對象池的技術,使用這種技術可以避免頻繁地申請和釋放內存空間。因此在析構時,通常都是將對象占用的空間歸還到內存池中。這一點在接下來對Python內建對象的實現中可以看得一清二楚。

 

責任編輯:佚名 來源: 互聯網
相關推薦

2010-03-26 18:51:51

Python作用域

2010-03-12 15:29:19

Pythonexe

2010-03-24 16:25:18

Python源代碼

2010-04-21 17:09:17

Oracle安裝

2010-05-13 17:00:32

MySQL啟動方法

2010-04-20 11:06:33

Oracle索引

2010-05-28 18:16:43

MySQL 操作日志

2010-06-01 15:54:46

MySQL-pytho

2010-03-10 19:00:20

Pythonnext函

2010-04-30 16:42:08

Oracle歸檔模式

2010-05-27 14:35:25

MySQL批量導入

2010-03-26 11:00:55

Python嵌入CC++

2010-04-06 08:58:27

Oracle job

2010-07-21 15:22:07

2010-04-02 13:34:33

Oracle DBA

2010-05-12 13:45:25

Mysql 復制設置

2010-04-06 10:11:11

Oracle備份

2010-04-21 15:52:45

Oracle游標

2010-03-23 17:24:08

Python遍歷目錄樹

2020-11-10 08:45:35

Python
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产欧美一区二区三区久久 | 国产精品日日做人人爱 | 中文字幕一区二区三区四区 | 欧美日韩国产精品一区二区 | 国产色婷婷久久99精品91 | 成人午夜在线 | 国产91综合一区在线观看 | 免费看黄色视屏 | 国产成人在线播放 | 日韩欧美在线观看一区 | 成人在线网址 | 日韩欧美国产一区二区 | 欧美在线视频一区二区 | 久久婷婷香蕉热狠狠综合 | 久久99精品国产自在现线小黄鸭 | 国产乱码精品一区二区三区中文 | 黄色一级在线播放 | 国产视频第一页 | 色综合美女 | 婷婷丁香综合网 | 日韩精品一区二区三区视频播放 | 久久国产精品久久国产精品 | 精品一区二区三区在线观看国产 | 久久这里有精品 | 国产视频精品免费 | 欧美激情a∨在线视频播放 成人免费共享视频 | 亚洲精品久久久久久首妖 | 亚洲情综合五月天 | 99精品在线| 看a网站 | 国产精品精品视频一区二区三区 | 91天堂网 | 亚洲少妇综合网 | 亚洲高清电影 | 国产黄色大片在线免费观看 | 少妇午夜一级艳片欧美精品 | 色性av| 欧美成人精品一区二区三区 | 国产成人精品久久二区二区 | 99资源站 | 欧美日韩精品免费观看 |