1.1.2 定长对象和变长对象
整数对象的特殊信息是一个C 中的整形变量,无论这个整数对象的值有多大,都可以保存在这个整形变量(ob_ival)中。但是很不幸,对于另一类对象,就没这么幸运了。如果你是Python 的设计师,考虑一下应该如何实现字符串对象。很显然,类似于PyIntObject,在PyObject 之外,字符串对象应该维护“一个字符串”,但在C 中,没有“一个字符串”这样的概念,所以准确的说法是,字符串对象应该维护“n 个char 型变量”。这种对象实际上不光是字符串对象,比如对应于C++中list 或vector 的列表对象,它也应该维护“n个PyObject 对象”。看上去这种“n 个……”似乎也是一类Python 对象的共同特征,因此,Python 在PyObject 对象之外,还有一个表示这类对象的结构体——PyVarObject:
[object.h] |
我们把整数对象这样不包含可变长度数据的对象称为“定长对象”,而字符串对象这样包含可变长度数据的对象称为“变长对象”,它们的区别在于定长对象的不同对象占用的内存大小是一样的,而变长对象的不同对象占用的内存可能是不一样的。比如,整数对象“1”和“100”占用的内存大小都是sizeof(PyIntObject),而字符串对象“Python”和“Ruby”占用的内存大小就不同了。正是这种区别导致了PyVarObject 对象中ob_size的出现。变长对象通常都是容器,ob_size 这个成员实际上就是指明了变长对象中一共容纳了多少个元素。注意,ob_size 指明的是所容纳元素的个数,而不是字节的数量。比如对于Python 中最常用的list,它就是一个PyVarObject 对象,如果某一时刻,这个list中有5 个元素,那么ob_size 的值就是5。
从PyObject_VAR_HEAD 的定义可以看出,PyVarObject 实际上只是对PyObject 的一个扩展而已。因此,对于任何一个PyVarObject,其所占用的内存,开始部分的字节的意义和PyObject 是一样的。换句话说,在Python 内部,每一个对象都拥有相同的对象头部。这就使得在Python 中,对对象的引用变得非常的统一,我们只需要用一个PyObject*指针就可以引用任意的一个对象。而不论该对象实际是一个什么对象。
图1-1 显示了Python 中不同对象与PyObject、PyVarObject 在内存布局上的关系:
|
| 图1-1 不同Python 对象与PyObject、PyVarObject 的关系 |
| 回书目 上一节 下一节 |
|
||||
| · 无线路由器故障处理 · 解析35岁技术人的价值.. · 无线重中之重:安全问题 · 无线局域网基本知识 · 家庭无线局域网 · 华为七千人主动辞职规.. · 微软出价446亿美元收购.. · 虚拟化的“赤壁之战” |
· Windows Server 2008专.. · 802.11n:下一代的无线.. · 脉冲无线电uwb专题 · AIX操作系统管理应用 · 云计算时代来临 · 求职必杀技 决战面试官 · 龙芯要做中国的“奔腾” · 2008年上半年IT技术图.. |
|||
|
||||
| · SOA 面向服务架构 · SQL Server 2008/2005.. · Apache技术专题 · 三层交换技术专题 · SQL Server入门到精通 · 无线网状网(MESH) · Windows远程桌面应用 · C#技术开发指南 |
· Apache技术专题 · Windows集群服务应用 · C#技术开发指南 · 文档格式标准开战 OOXM.. · 路由器设置与口令恢复 · Linux 集群技术专题 · PHP开发应用手册 · SOA 面向服务架构 |
|||
|
||||
| · SQL Server入门到精通 · SQL Server 2008/2005.. · SOA 面向服务架构 · Apache技术专题 · C#技术开发指南 · 三层交换技术专题 · Apache技术专题 · C#技术开发指南 |
· Windows远程桌面应用 · 企业数据恢复指南 · Windows集群服务应用 · 路由器设置与口令恢复 · Linux 集群技术专题 · SOA 面向服务架构 · 了解统一威胁管理(UTM).. · 解析35岁技术人的价值.. |
|||