• C语言程序中的内存结构数组


    我个人的理解:其实质,和Java里的Hash表有点类似。在C语言中是为了解决数组无法扩展的缺陷。

    例子:

    看 PostgreSQL对 VFD的处理:

    初始化:

    /*
     * Virtual File Descriptor array pointer and size.    This grows as
     * needed.    'File' values are indexes into this array.
     * Note that VfdCache[0] is not a usable VFD, just a list header.
     */
    static Vfd *VfdCache;
    static Size SizeVfdCache = 0;
    /*
     * InitFileAccess --- initialize this module during backend startup
     *
     * This is called during either normal or standalone backend start.
     * It is *not* called in the postmaster.
     */
    void
    InitFileAccess(void)
    {
        Assert(SizeVfdCache == 0);    /* call me only once */
    
        /* initialize cache header entry */
        ///####
        VfdCache = (Vfd *) malloc(sizeof(Vfd));
        if (VfdCache == NULL)
            ereport(FATAL,
                    (errcode(ERRCODE_OUT_OF_MEMORY),
                     errmsg("out of memory")));
    
        MemSet((char *) &(VfdCache[0]), 0, sizeof(Vfd));
        VfdCache->fd = VFD_CLOSED;
    
        SizeVfdCache = 1;
    
        /* register proc-exit hook to ensure temp files are dropped at exit */
        on_proc_exit(AtProcExit_Files, 0);
    }

    扩展:

    static File
    AllocateVfd(void)
    {
        Index        i;
        File        file;
    
        DO_DB(elog(LOG, "AllocateVfd. Size %lu", SizeVfdCache));
    
        Assert(SizeVfdCache > 0);    /* InitFileAccess not called? */
    
        if (VfdCache[0].nextFree == 0)
        {
            /*
             * The free list is empty so it is time to increase the size of the
             * array.  We choose to double it each time this happens. However,
             * there's not much point in starting *real* small.
             */
            Size        newCacheSize = SizeVfdCache * 2;
            Vfd           *newVfdCache;
    
            if (newCacheSize < 32)
                newCacheSize = 32;
    
            ////####
            /*
             * Be careful not to clobber VfdCache ptr if realloc fails.
             */
            newVfdCache = (Vfd *) realloc(VfdCache, sizeof(Vfd) * newCacheSize);
            if (newVfdCache == NULL)
                ereport(ERROR,
                        (errcode(ERRCODE_OUT_OF_MEMORY),
                         errmsg("out of memory")));
            VfdCache = newVfdCache;
    
            /*
             * Initialize the new entries and link them into the free list.
             */
            for (i = SizeVfdCache; i < newCacheSize; i++)
            {
                MemSet((char *) &(VfdCache[i]), 0, sizeof(Vfd));
                VfdCache[i].nextFree = i + 1;
                VfdCache[i].fd = VFD_CLOSED;
            }
            VfdCache[newCacheSize - 1].nextFree = 0;
            VfdCache[0].nextFree = SizeVfdCache;
    
            /*
             * Record the new size
             */
            SizeVfdCache = newCacheSize;
        }
    
        file = VfdCache[0].nextFree;
    
        VfdCache[0].nextFree = VfdCache[file].nextFree;
    
        return file;
    }
  • 相关阅读:
    SQL Server 2008中如何为XML字段建立索引
    比如取得一个div得innerHTML
    C#生成CHM文件(入门篇)
    jquery outerhtml
    WCF 中状态的保存
    MVC进阶学习HtmlHelper控件解析(一)
    MVC进阶学习HtmlHelper控件解析(四)
    MVC进阶学习HtmlHelper之GridView控件拓展(一)
    MVC进阶学习HtmlHelper控件解析(三)
    MVC进阶学习表单提交总结
  • 原文地址:https://www.cnblogs.com/gaojian/p/3096170.html
Copyright © 2020-2023  润新知