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. html-----014---统一资源定位器

    HTML 统一资源定位器 URL 可以由单词组成,比如 “w3school.com.cn”,或者是因特网协议(IP)地址:192.168.1.253.大多数人在网上冲浪时,会键入网址的域名,因为名称比 ...

  2. HDU 1619 Unidirectional TSP(单向TSP + 路径打印)

    Unidirectional TSP Problem Description Problems that require minimum paths through some domain appea ...

  3. arcgisserver

    http://www.cnblogs.com/hll2008/archive/2008/11/14/1333828.html

  4. Leaflet交流

    GIS科研网 Leaflet交流 谢绝转载 http://www.3sbase.com欢迎加群交流  108299288 http://www.3sbase.com/3sbase/webgistest ...

  5. Android版多线程下载器核心代码分享

    首先给大家分享多线程下载核心类: package com.example.urltest; import java.io.IOException; import java.io.InputStream ...

  6. Git---Git及GitHub使用笔记

    一.远程项目获取(克隆) syntax: $ git clone <版本库的网址> $ git clone <版本库的网址> <本地目录名> example: $ ...

  7. Check Mysql Database Size

    SELECT ROUND( SUM(data_length + index_length) / 1024 / 1024 ) TOTAL_MB, ROUND(SUM(data_length) / 102 ...

  8. tmux与vim主题不一致

    在centos6.5 x64 vim6.2 需要在tmux.conf中添加set -g default-terminal "screen-256color" 然后再次启动tmux的 ...

  9. (转载)与OpenDialog相关的一个问题

    OpenDialog的一个问题 有一个功能要求就是[每次打开文件的对话框的默认路径是上一次保存文件的路径],本来这个就是设置OpenDialog控件的InitialDir属性就行了,但是第一次打开的时 ...

  10. java中抽象类与接口的区别

    1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系.但是,一个类却可以实现多个interface. 2.在abstract class 中可以有自己 ...