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

运用char 数组时会发现,char数组的元素的长度是固定了的。也即是说,一旦,数组创建完毕,就不可变了。那假如咱们想让数组元素的巨细能够改动,那么在MFC中 就运用CString数组,假如是纯C++环境中,运用string数组,都是能够到达需求的。bcn平台总代这篇文章只叙述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数
组给了指导,关于平时开发也是一个启示,要点在于这个完成思路。经过指针直接完成元素的调整。mgm时时彩平台而元素巨细的调整即是内存的再分配问题了。这个不是啥难
点,运用C言语的内存重新分配函数即可做到。
        从图中能够看出,每一个CString目标都是以2c 7b 最初的。所以咱们能够明白的看到CString的三个目标的分界点。从右边的字符大致能够看出,这个即是CString目标了。然而咱们却没有看到CString目标中存储的字符串。这个咱们很简单想到,CString目标的数据是有一个缓冲区的,CString目标里仅仅存储这个缓冲区的地址算了,所以在此是看不到数据的。这儿咱们就不必重视这个缓冲区问题了。
        咱们在此阐明CString数组的内部完成方法。期望你能从中领会到CString数组的完成机制,伯乐娱乐平台对CString数组不再生疏,乃至十分深化的了解,从而在运用时灵敏自若。

时间: 2024-11-25 07:08:01

CString数组内部的实现原理深入剖析的相关文章

【转】Unity协程(Coroutine)原理深入剖析

Unity协程(Coroutine)原理深入剖析 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield return ,就可以通过StartCoroutine调用了.后来也是一直稀里糊涂地用,上网google些基本都是例子,很少能帮助深入理解Unit

Unity协程(Coroutine)原理深入剖析再续

Unity协程(Coroutine)原理深入剖析再续 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 前面已经介绍过对协程(Coroutine)的认识和理解,主要讲到了Unity引擎在执行协程(Coroutine)的原理(Unity协程(Coroutine)原理深入剖析)和对协程(Coroutine)状态的控制(Unity协程(Coroutine)管理类--TaskManager工具分享),到这使用Coroutine的疑问就没有了,但是D

Unity协程(Coroutine)原理深入剖析(转载)

记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield return ,就可以通过StartCoroutine调用了.后来也是一直稀里糊涂地用,上网google些基本都是例子,很少能帮助深入理解Unity协程的原理的. 本文只是从Unity的角度去分析理解协程的内部运行原理,而不是从C#底层的语法实现来介绍(后续有需要再进行介绍),一共分为三部分: 线程(

Unity协程(Coroutine)原理深入剖析

尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com 记得去年6月份刚开始实习的时候,当时要我写网络层的结构,用到了协程,当时有点懵,完全不知道Unity协程的执行机制是怎么样的,只是知道函数的返回值是IEnumerator类型,函数中使用yield return ,就可以通过StartCoroutine调用了.后来也是一直稀里糊涂地用,上网google些基本都是例子,很少能帮助深入理解Unity协程的原理的. 本文只是从Unity的角度去分析理解协程的内部运行原理

Vue.js学习 Item12 – 内部响应式原理探究

深入响应式原理 大部分的基础内容我们已经讲到了,现在讲点底层内容.Vue.js 最显著的一个功能是响应系统 —— 模型只是普通对象,修改它则更新视图.这让状态管理非常简单且直观,不过理解它的原理也很重要,可以避免一些常见问题.下面我们开始深挖 Vue.js 响应系统的底层细节. 如何追踪变化 把一个普通对象传给 Vue 实例作为它的 data 选项,Vue.js 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter.这是 ES5 特性,不能打补丁

七种机器内部排序的原理与C语言实现,并计算它们的比较次数与移动次数。

内部排序是指待排序列完全存放在内存中所进行的排序过程,适合不太大的元素序列. 排序是计算机程序设计中的一种重要操作,其功能是对一个数据元素集合或序列重新排列成一个按数据元素某个相知有序的序列.排序分为两类:内排序和外排序. 其中快速排序的是目前排序方法中被认为是最好的方法. 内部排序方法: 1.插入排序(直接插入排序): 2.快速排序: 3.选择排序(简单选择排序): 4.归并排序: 5.冒泡排序: 6.希尔排序(希尔排序是对直接插入排序方法的改进): 7.堆排序: ——摘自百度百科 #ifnd

PHP数组遍历与实现原理

一维数组遍历(普通) 一.for与foreach遍历结果顺序一致 $arr = array('max','xiaoli','xiaowang','laosan'); //for遍历 for($i=0;$i<count($arr);$i++){ echo $arr[$i];//max xiaoli xiaowang laosan } //foreach遍历 foreach($arr as $item){ echo $item;//max xiaoli xiaowang laosan } 二.for

Mysql binlog应用场景与原理深度剖析

本文深入介绍Mysql Binlog的应用场景,以及如何与MQ.elasticsearch.redis等组件的保持数据最终一致.最后通过案例深入分析binlog中几乎所有event是如何产生的,作用是什么. 1 基于binlog的主从复制 Mysql 5.0以后,支持通过binary log(二进制日志)以支持主从复制.复制允许将来自一个MySQL数据库服务器(master) 的数据复制到一个或多个其他MySQL数据库服务器(slave),以实现灾难恢复.水平扩展.统计分析.远程数据分发等功能.

数组问题(鸽巢原理、数字交换、链表寻环)

287. 寻找重复数 不能更改原数组(假设数组是只读的). 只能使用额外的 O(1) 的空间. 时间复杂度小于 O(n2) . 数组中只有一个重复的数字,但它可能不止重复出现一次. 因为不能能改原来的数组,并且只能使用额外O1的空间,所以我们不能使用map记录,也不能维护一个新的数组 因为时间复杂度要在n2以内,所以暴力查找也是不可取的 因为数据范围在1~n-1,所以可以保证不会数组越界,因此使用链表中快慢指针寻找环算法 https://www.cnblogs.com/fankongkong/p