您所在的位置: 首页>>读书频道>>设计开发>>其它开发>>

8.1.2 PyFrameObject 中的动态内存空间

http://book.51cto.com  2008-07-23 15:46  陈儒著  电子工业出版社  我要评论(0)
  • 摘要:《Python源码剖析--深度探索动态语言核心技术》第8章Python 虚拟机框架,从这一章开始,我们将切入Python 字节码虚拟机,深入剖析Python 字节码虚拟机的运行机理,本小节为大家介绍的是PyFrameObject 中的动态内存空间。
  • 标签:Python  源码剖析  虚拟机  PyFrameObject  动态语言  C程序员

8.1.2 PyFrameObject 中的动态内存空间

在PyFrameObject 对象所维护的运行时栈中,存储的都是PyObject*,可以看出,这个栈的起始位置是从f_localsplus 开始的。其实不完全正确,f_localsplus 确实维护了一段变动长度的内存,但是这段内存不只是给栈使用的,还有别的对象也会使用:

[frameobject.c](有删节)
PyFrameObject *
PyFrame_New(PyThreadState *tstate,
PyCodeObject *code, PyObject *globals,
PyObject *locals)
{
PyFrameObject *f;
Py_ssize_t extras, ncells, nfrees, i;
ncells = PyTuple_GET_SIZE(code->co_cellvars);
nfrees = PyTuple_GET_SIZE(code->co_freevars);
//四部分构成了PyFrameObject 维护的动态内存区,
其大小由extras 确定
extras = code->co_stacksize + code->
co_nlocals + ncells + nfrees;
f = PyObject_GC_NewVar(PyFrameObject,
&PyFrame_Type, extras);
//计算初始化时运行时栈的栈顶
extras = code->co_nlocals + ncells + nfrees;
//f_valuestack 维护运行时栈的栈底,f_stacktop
维护运行时栈的栈顶
f->f_valuestack = f->f_localsplus + extras;
f->f_stacktop = f->f_valuestack;
return f;
}
可见,在创建PyFrameObject 对象时,额外申请的那部分内存中有一部分是给PyCode-Object 对象中存储的那些局部变量的、co_freevars、co_cellvars 使用的(关于co_freevars、co_cellvars,它们涉及Python 中对闭包的实现,在以后考察函数机制时会深入剖析),而另一部分才是给运行时栈使用的。所以,PyFrameObject 对象中的栈的起始位置(也就是栈底)是由f_valuestack 维护的,而f_stacktop 维护了当前的栈顶。图8-3 是一个刚被创建的PyFrameObject 对象的示意图。从中可以清晰地看到运行时栈和PyFrameObject 对象中动态内存部分的关系。
 
(点击查看大图)图8-3 新创建的PyFrameObject 对象
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节
虚拟机软件入门
Python实用开发指南
深入Vista应用程序开发
Ruby on Rails 社区网站开发
ASP.NET从入门到精通
 
 验证码: (点击刷新验证码)   匿名发表
  • Visual C++ 完全自学宝典

  • 作者:强锋科技,朱洪波
  • Visual C++ 6.0是微软公司为程序人员提供的Visual Studio 6.0工具套件中的重要组成部分。本书由浅入深地介绍使用Visual C++ 6.0..
Copyright©2005-2008 51CTO.COM 版权所有