MySQL源码中自己定义了许多数据结构,放在mysys的目录下,源码中通常都使用这些数据结构来组织存放数据,也更容易实现跨平台。

 
下面先来看下MySQL定义的动态数组:
【源代码include/array.h  mysys/array.c】
typedef struct st_dynamic_array
{
uchar *buffer;
ulong elements, max_element;
ulong alloc_increment;
uint size_of_element;
} DYNAMIC_ARRAY;
特点:
     1. 动态数组中的元素具有固定的内存空间大小 size_of_element
     2. 插入一个元素时,提供元素的指针,写入时会指针所指向的位置开始后的size_of_element字节的内存memcpy到数组中
     3. 检索时,提供单个索引位置的直接定位,或者根据elements来for轮询所有的元素
 
下面看一下针对动态数组的函数:
     1. init_dynamic_array2(DYNAMIC_ARRAY *array, uint element_size,

void *init_buffer, ulong init_alloc, 
                            ulong alloc_increment)

          初始化elements=max_element=0
          malloc init_alloc*element_size大小的内存空间给array->buffer。
 
     2. insert_dynamic(DYNAMIC_ARRAY *array, uchar* element)
          插入一个元素 element
          如果elements==max_element,则内存空间已经使用完,需要realloc空间,并把原来空间的内存memcpy过来。
          最后追加element到数组的最后
     3. alloc_dynamic(DYNAMIC_ARRAY *array)
          分配一个新的元素空间,并把elements++;
     4. pop_dynamic(DYNAMIC_ARRAY *array)
          弹出数组的最后一个元素,这里只是把elements--即可。
     5. get_dynamic(DYNAMIC_ARRAY *array, uchar* element, ulong idx)
          获取array数组中位置是idx的元素,并把内存copy到element中,所以调用前需要给element分配好空间。
 
     6. delete_dynamic(DYNAMIC_ARRAY *array)
          删除动态数组,并使用my_free把内存释放出来
 
     7. delete_dynamic_element(DYNAMIC_ARRAY *array, ulong idx)
          删除数组中位置是indx的元素,并把indx后面的元素向前移动。
     
     8. get_index_dynamic(DYNAMIC_ARRAY *array, uchar* element)
          获取element在数组中的位置。

MySQL源码 数据结构array的更多相关文章

  1. MySQL源码 数据结构hash

    MySQL源码自定义了hash表,因为hash表具有O(1)的查询效率,所以,源码中大量使用了hash结构.下面就来看下hash表的定义: [源代码文件include/hash.h mysys/has ...

  2. MySQL源码:索引相关的数据结构

    http://www.orczhou.com/index.php/2012/11/mysql-source-code-data-structure-about-index/ 本文将尝试介绍MySQL索 ...

  3. MySQL源码分析以及目录结构 2

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  4. MySQL源码分析以及目录结构

    原文地址:MySQL源码分析以及目录结构作者:jacky民工 主要模块及数据流经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修改.本文将对MySQL的整体架构及重要目录进行讲述. 源码结 ...

  5. mysql源码解读之配置文件

    要研究mysql,最好的资源莫过于源码了,所以本人打算通过调试源码的方式来深入理解mysql的点点滴滴.搭建mysql调试环境很简单,从官方下载mysql源码,利用cmake工具生成工程即可.为了方便 ...

  6. Mysql源码分析--csv存储引擎

    一直想分析下mysql的源码,开始的时候不知道从哪下手,先从csv的文件存储开始吧,这个还是比较简单的.我是用的是mysql5.7.16版本的源码. csv源码文件在mysql源码的mysql-5.7 ...

  7. 深入MySQL源码 学习方法 何登成专家

    MYSQL 技术圈 有哪些做得好,又注重分享的公司: Oracle MySQL, MariaDB, Percona,Google, FB, Twitter, Taobao, NetEase… 有哪些值 ...

  8. mysql 源码调试方法

     http://blog.itpub.net/29254281/viewspace-1847415/ 其中吕海波老师分享的内容是 <调试Oracle二三例:调试技术在日常运维中的应用>其中 ...

  9. 【转】Ubuntu编译安装mysql源码

    主要参考了下面两篇文章 http://forum.ubuntu.org.cn/viewtopic.php?t=330121 http://www.linuxidc.com/Linux/2011-09/ ...

随机推荐

  1. MVC小系列(十七)【自定义验证规则给下拉框】

    因为下拉框不支持验证,所以写一个attribute特性,让它继承ValidationAttributemvc的特性验证,很直接,无论是数据安全特性上还是页面表现上都不错,它的运行机制: 前台表单验证规 ...

  2. MP4(一)-结构

    http://blog.csdn.net/zhuweigangzwg/article/details/17222951 一.基本概念 1.mp4概述 MP4文件中的所有数据都装在box(QuickTi ...

  3. CDN调度器HAProxy、Nginx、Varnish

    http://www.ttlsa.com/web/the-cdn-scheduler-nginx-haproxy-varnish/ CDN功能如下:1.将全网IP分为若干个IP段组,分组的依据通常是运 ...

  4. /etc/resolv.conf文件详解

    大家好,今天51开源给大家介绍一个在配置文件,那就是/etc/resolv.conf.很多网友对此文件的用处不太了解.其实并不复杂,它是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名 ...

  5. frame 第三节

    1.准备3个文件 main.html: <html> <head> <title>框架</title> </head> <frames ...

  6. linux命令之端口占用

    1.lsof命令 eg: lsof -i:8080,这里显示8080端口在被java使用,状态是LISTEN, 可以使用killall 进程名(killall java) 结束占用端口的进程(不建议, ...

  7. 【制作镜像Win*】环境准备

    1. 保证网络通 2. 保证系统为centos6.x/rhel 6.x 3. yum源正确,推荐使用utsc源,nailgun也ok 4.安装软件包 virsh list guestmount yum ...

  8. shell中的双引号,单引号,反引号

    在shell中引号分为三种:单引号,双引号和反引号. 单引号 ‘ 由单引号括起来的字符都作为普通字符出现.特殊字符用单引号括起来以后,也会失去原有意义,而只作为普通字符解释.单引号用于保持引号内所有字 ...

  9. PHP curl 采集内容之规则 1

    <?phpheader("Content-type:text/html; charset=utf-8");$pattern = '/xxx(.*)yyyy/isU'; //i ...

  10. 一分钟搭建Webpack+react+es6框架

    最近react刷屏的厉害,而随着它一起走进我们视野的还有webpack,webpack只是个工具,为什么如此火呢?因为简单好了不废话.   直接进入正题: 打开命令行工具: npm install - ...