闡述Python PyString Object對象
Python PyString Object傳入的參數(shù)必須是以NULL結(jié)尾的字符數(shù)組的指針,而PyString_FromStringAndSize不會有這樣的要求,因為通過傳入的size參數(shù)就可以確定需要拷貝的字符的個數(shù)。
Python PyStringObject中的ob_shash變量其作用是緩存該對象的HASH值,這樣可以避免每一次都重新計算該字符串對象的HASH值。如果一個PyStringObject對象還沒有被計算過HASH值,那么ob_shash的初始值是-1。在計算一個對象的HASH值時,采用如下的算法:
- [stringobject.c]static long string_hash(PyStringObject *a){
- register int len;
- register unsigned char *p;
- register long x;
- if (a->ob_shash != -1)
- return a->ob_shash;
- len = a->ob_size;
- p = (unsigned char *) a->ob_sval;
- x = *p << 7;
- while (--len >= 0)
- x = (1000003*x) ^ *p++;
- x ^= a->ob_size;
- if (x == -1)
- x = -2;
- a->ob_shash = x;
- return x;}
Python PyString Object對象的ob_sstate變量該對象是否被Intern的標志,關(guān)于PyStringObject的Intern機制,在后面會詳細介紹,下面看一下PyStringObject對應(yīng)的類型對象:
- [stringobject.c]
- PyTypeObject PyString_Type = {
- PyObject_HEAD_INIT(&PyType_Type)
- 0, "str",
- sizeof(PyStringObject),
- sizeof(char), …… (reprfunc)string_repr,
- /* tp_repr */ &string_as_number,
- /* tp_as_number */ &string_as_sequence,
- /* tp_as_sequence */ &string_as_mapping,
- /* tp_as_mapping */ (hashfunc)string_hash,
- /* tp_hash */ 0, /* tp_call */ …… string_new,
- /* tp_new */ PyObject_Del,
- /* tp_free */};
可以看到,在Python PyString Object的類型對象中,tp_itemsize被設(shè)置為sizeof(char),即一個字節(jié)。對于Python中的任何一種變長對象,tp_itemsize這個域是必須設(shè)置的,tp_itemsize指明了由變長對象保存的元素的單位長度,所謂單位長度即是指一個對象在內(nèi)存中的長度。這個tp_itemsize和ob_size共同決定了應(yīng)該額外申請的內(nèi)存的總大小是多少。
【編輯推薦】