python的内存管理机制

Python011

python的内存管理机制,第1张

论坛

活动

招聘

专题

打开CSDN APP

Copyright © 1999-2020, CSDN.NET, All Rights Reserved

登录

XCCS_澍

关注

Python 的内存管理机制及调优手段? 原创

2018-08-05 06:50:53

XCCS_澍

码龄7年

关注

内存管理机制:引用计数、垃圾回收、内存池。

一、引用计数:

    引用计数是一种非常高效的内存管理手段, 当一个 Python 对象被引用时其引用计数增加 1, 当其不再被一个变量引用时则计数减 1. 当引用计数等于 0 时对象被删除。

二、垃圾回收 :

1. 引用计数

      引用计数也是一种垃圾收集机制,而且也是一种最直观,最简单的垃圾收集技术。当 Python 的某个对象的引用计数降为 0 时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾了。比如某个新建对象,它被分配给某个引用,对象的引用计数变为 1。如果引用被删除,对象的引用计数为 0,那么该对象就可以被垃圾回收。不过如果出现循环引用的话,引用计数机制就不再起有效的作用了

2. 标记清除

     如果两个对象的引用计数都为 1,但是仅仅存在他们之间的循环引用,那么这两个对象都是需要被回收的,也就是说,它们的引用计数虽然表现为非 0,但实际上有效的引用计数为 0。所以先将循环引用摘掉,就会得出这两个对象的有效计数。

3. 分代回收

     从前面“标记-清除”这样的垃圾收集机制来看,这种垃圾收集机制所带来的额外操作实际上与系统中总的内存块的数量是相关的,当需要回收的内存块越多时,垃圾检测带来的额外操作就越多,而垃圾回收带来的额外操作就越少;反之,当需回收的内存块越少时,垃圾检测就将比垃圾回收带来更少的额外操作。

在C++中,“类函数指针”和传统的“函数指针”,是两个完全不同的东西。

你取一个类的成员函数的地址,得到的是一个类函数指针,也叫成员函数指针。即使你的成员函数定义看起来和普通函数原型完全一样,它也和这个原型的普通函数指针完全不同,彼此之间不能转换。

PyEval_SetTrace要求传入的是一个传统的函数指针,你传入一个类函数指针,当然是不行的。编译器报错是说无法将一个类函数指针转换为函数指针。

C++的类函数指针,是一个非常难用的东西,有非常多奇怪的特性,而且不同编译器对它的支持大不相同,是C++著名的复杂性来源之一,建议不要使用。

你想要的东西,实际上是一个“委托”的概念,不过可惜的是C++并不支持委托。使用boost::function可以实现类似功能,但python的C API接口却不支持boost::function,所以也不行。

你这种情况,最简单的方法还是用传统的函数指针,使用普通函数包装下类的成员函数,然后把普通函数的指针传给python。