当前位置:C++技术网 > 资讯 > CString数组内部的实现原理深入剖析

CString数组内部的实现原理深入剖析

更新时间:2015-06-26 21:06:05浏览次数:1+次

    使用char 数组时会发现,char数组的元素的长度是固定了的。也就是说,一旦,数组创建完毕,就不可变了。那如果我们想让数组元素的大小可以改变,那么在MFC中就使用CString数组,如果是纯C++环境中,使用string数组,都是可以达到要求的。本文只讲述CString数组的内部实现原理,string的讲解,将会单独讲解一篇文章。顺便提一下,如果想使用数组可以动态增加元素个数,甚至想数组元素个数可以动态调整且元素大小也可以动态调整,那么就使用string或者CString作为元素的STL容器vector吧。
    在MFC中使用CString数组代码如下:
CString str[] = {L"第一串CString",L"第二串CString",L"第三串CString"};
int iSize3 = sizeof(str[0]);// - 4字节,第一个CString对象的地址
int iSize4 = sizeof(str[1]);// - 4字节,第二个CString对象的地址
int iSize5 = sizeof(str[2]);// - 4字节,第三个CString对象的地址

/* - 调整元素的大小 - */
str[0]=L"增大CString 的长度。。。。。。。";
str[1]=L"增大CString 的长度。。。。。。。";
str[2]=L"增大CString 的长度。。。。。。。";

CString数组实现原理剖析:

0x0024F244   CString数组的起始地址
0x0024F244   CString数组的第一个元素地址
0x0024F248   CString数组的第二个元素地址

0x0024F24C   CString数组的第三个元素地址

说明:元素地址之间,相隔4个字节,表明元素大小为4个字节,即一个指针变量的大小。
CString数组:
数组第一个元素的值:0x0039cbb8  (表示第一个CString对象的地址)
数组第二个元素的值:0x0039cc20  (表示第二个CString对象的地址)
数组第三个元素的值:0x0039cc88  (表示第三个CString对象的地址)

    通过第一个元素存储的CString对象的地址,通过内存可以看到,如下图所示的内存的数据:

    因为这里的对象是顺序存放的。所以,可以同时看到三个CString对象。但这不表示一定是这样,只是实现是这样的。CString数组只能做到数组中的三个CString对象指针是存储在一块的就行了。然后通过数组中元素存储的CString对象的地址来找到对应的CString对象。因此,实现CString的内容的动态调整,只要调整指针指向的CString对象即可。这样与数组本身脱离,就不会出现设计瓶颈。我们也可以和普通数组一样使用CString数组,也实现了数组中元素的大小自由的调整。这是在char数组无法实现的。
    当然,了解以上的原理后,我们也可以实现一个可以调整元素大小的数组。因此,这里剖析出来后,给我们一个很大的启示,不仅给我们学习使用CString数组给了指导,对于日常开发也是一个启发,重点在于这个实现思路。通过指针间接实现元素的调整。而元素大小的调整就是内存的再分配问题了。这个不是什么难点,使用C语言的内存重新分配函数即可做到。
    从图中可以看出,每一个CString对象都是以2c 7b 开头的。所以我们可以清楚的看到CString的三个对象的分界点。从右边的字符大致可以看出,这个就是CString对象了。然而我们却没有看到CString对象中存储的字符串。这个我们很容易想到,CString对象的数据是有一个缓冲区的,CString对象里只是存储这个缓冲区的地址罢了,所以在此是看不到数据的。这里我们就不用关注这个缓冲区问题了。
    我们在此说明CString数组的内部实现方法。希望你能从中领会到CString数组的实现机制,对CString数组不再陌生,甚至非常深入的理解,从而在使用时灵活自如。