青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉(zhuǎn)貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數(shù)據(jù)加載中……

apr_pool -- 內(nèi)存池

這個指南主要介紹如何使用libaprapache portable runtime)。
版權(quán)所有,Copyright (C) 2005 INOUE Seiichiro <inoue&ariel-networks.com>,翻譯:成彥
原文地址:http://dev.ariel-networks.com/apr/apr-tutorial/html/apr-tutorial.html
轉(zhuǎn)載時請保留版權(quán)信息。

大多數(shù)libaprAPI都依賴于內(nèi)存池,借助內(nèi)存池,簡化了內(nèi)存塊的管理。想像一下沒有內(nèi)存池系統(tǒng)的情況:你申請一些內(nèi)存塊就必需逐個釋放它們,例如如果你申請了10個內(nèi)存塊,你必需釋放10次,否則,你將遭受內(nèi)存泄露的錯誤。內(nèi)存池解決了這個令人感到繁瑣的問題,在申請一個內(nèi)存池之后,你可以從內(nèi)存池中申請多個內(nèi)存塊,釋放它們的時候,你所需要做的就是銷毀內(nèi)存池,這樣你就可以釋放所有的內(nèi)存塊了。這有兩個優(yōu)點,第一,它可以預(yù)防內(nèi)存泄露的錯誤;第二,分配內(nèi)存塊的開銷相對變低了。從某種意義上說,內(nèi)存池迫使你遵循面向會話編程,一個內(nèi)存池就是一種會話內(nèi)容,這樣,處于同一個內(nèi)存池中的對象就有相同的生命周期,你可以通過控制會話內(nèi)容來控制對象。在一個會話的開始,你創(chuàng)建了一個內(nèi)存池,接著,你在內(nèi)存池中創(chuàng)建了一些對象,你不需要去關(guān)心這些對象的生命周期,最后,在會話結(jié)束的時候,你只需要將那個內(nèi)存池銷毀就可以了。

注:通常,對象生命周期控制是程序開發(fā)最困難的部分,因此,針對這個問題還存在有一些技術(shù),例如智能指針,垃圾回收機制等等。需要注意,同時使用這些技術(shù)有一定的難度,內(nèi)存池也是這其中的一項技術(shù),所以你不得不非常小心的使用它們。

注:在將來,libapr的內(nèi)存池將變得不再那么重要。參見http://mail-archives.apache.org/mod_mbox/apr-dev/200502.mbox/%3c1f1d9820502241330123f955f@mail.gmail.com%3e.

下面有三個基本的API函數(shù):
/*
摘自 apr_pools.h */
    APR_DECLARE(apr_status_t) apr_pool_create(apr_pool_t **newpool, apr_pool_t *parent);
    APR_DECLARE(void *) apr_palloc(apr_pool_t *p, apr_size_t size);
    APR_DECLARE(void) apr_pool_destroy(apr_pool_t *p);

我們使用apr_pool_create()函數(shù)創(chuàng)建一個內(nèi)存池,這個內(nèi)存池將一直存活,直到你調(diào)用apr_pool_destroy()函數(shù)以后被銷毀。apr_pool_create()的第一個參數(shù)是一個結(jié)果輸出參數(shù),是一個新創(chuàng)建的apr_pool_t類型的內(nèi)存池對象。通過調(diào)用apr_palloc()來申請指定大小的內(nèi)存塊,具體使用方法見mp-sample.c

/*
摘自 mp-sample.c */
    apr_pool_t *mp;
    /*
創(chuàng)建內(nèi)存池 */
    apr_pool_create(&mp, NULL);

    /*
從內(nèi)存池中分配內(nèi)存塊 */
    char *buf1;
    buf1 = apr_palloc(mp, MEM_ALLOC_SIZE);

簡單地說,我們可以像使用malloc(3)這樣使用apr_palloc(),也可以調(diào)用apr_pcalloc(),正如你猜到的,apr_pcalloc類似于calloc(3)apr_pcalloc返回一個被0填充了的內(nèi)存塊。假如你使用了malloc(3)/calloc(3),你需要調(diào)用free(3)來釋放分配了的內(nèi)存。但是在內(nèi)存池中,你必不需要釋放每個內(nèi)存塊,你只需要對該內(nèi)存池調(diào)用apr_poll_destroy()函數(shù)從而釋放所有的內(nèi)存塊。

注:使用apr_palloc()申請內(nèi)存,其內(nèi)存塊的大小沒有限制,然而,在內(nèi)存池中申請大內(nèi)存并不是什么好主意。內(nèi)存池本質(zhì)上是為了更小的內(nèi)存塊而設(shè)計的,實際上,初始的內(nèi)存池的大小是8000字節(jié)。如果你需要申請超過幾兆字節(jié)的內(nèi)存塊時,那么就不要使用內(nèi)存池。
注:默認情況下,內(nèi)存池管理器從不將申請到的內(nèi)存歸還給系統(tǒng)。如果程序要運行很長時間,這將是一個問題,推薦像下面的代碼那樣指定一個上限:

/*
設(shè)置上限,讓內(nèi)存池管理器釋放內(nèi)存,將內(nèi)存返回給系統(tǒng)的示例代碼 */

#define YOUR_POOL_MAX_FREE_SIZE 32      /* apr_pool max free list size */
apr_pool_t *mp;
apr_pool_create(&mp, NULL);
apr_allocator_t* pa = apr_pool_allocator_get(mp);
if (pa) {
    apr_allocator_max_free_set(pa, YOUR_POOL_MAX_FREE_SIZE);
}

這兒有兩個API函數(shù)需要知道,一個是apr_pool_clear(),另一個是apr_pool_cleanup_register()apr_pool_clear()類似于apr_pool_destroy(),不同的是內(nèi)存池將一直存在。示例代碼如下:
/*
使用apr_pool_clear()的例子 */
apr_pool_t *mp;
apr_pool_create(&mp, NULL);
for (i = 0; i < n; ++i) {
    do_operation(..., mp);
    apr_pool_clear(mp);
}
apr_pool_destroy(mp);

do_operation()
里使用了內(nèi)存池,分配了一些內(nèi)存塊。假如在do_operation()之外不需要這些內(nèi)存塊了,可以調(diào)用apr_pool_clear()函數(shù),這樣能縮小內(nèi)存的使用大小。如果你熟悉系統(tǒng)的棧內(nèi)存的話,你會覺得內(nèi)存池與棧內(nèi)存一樣,調(diào)用apr_palloc只是如同移動SP(棧指針),調(diào)用apr_pool_clear()如同重置SP,兩者都是輕量級的操作。

使用apr_pool_cleanup_register()函數(shù),可以在內(nèi)存池清空/銷毀上設(shè)定一個鉤子(回調(diào))函數(shù),在內(nèi)存池清空或是銷毀后調(diào)用這個函數(shù),在這個回調(diào)函數(shù)中,你可以實現(xiàn)任何在內(nèi)存池上的結(jié)束代碼。

關(guān)于內(nèi)存池的最后一個主題是子池,每個內(nèi)存池都可以有一個父內(nèi)存池,因此,內(nèi)存池構(gòu)造了樹。apr_pool_create()的第二個參數(shù)表示父內(nèi)存池,當這個參數(shù)為NULL時,新創(chuàng)建的內(nèi)存池將變?yōu)橐粋€根內(nèi)存池,可以在這個根內(nèi)存池上創(chuàng)建子內(nèi)存池。在這個樹中對一個內(nèi)存池調(diào)用apr_pool_destroy()函數(shù),則該內(nèi)存池的子內(nèi)存池也將被銷毀;當對該內(nèi)存池調(diào)用apr_pool_clear()函數(shù),則這個內(nèi)存池存在但是它的子內(nèi)存池將被銷毀,上面提及到的那些清除函數(shù),在子內(nèi)存池銷毀時被調(diào)用。

注:當將NULL值做為清除回調(diào)函數(shù)時將會產(chǎn)生一個bug,你必須像下面的代碼那樣傳入apr_pool_cleanup_null
/*
關(guān)于內(nèi)存池典型bug的偽代碼 */
/* apr_pool_cleanup_register(mp, ANY_CONTEXT_OF_YOUR_CODE, ANY_CALLBACK_OF_YOUR_CODE, NULL);
這將產(chǎn)生一個bug */
/*
修正: */
apr_pool_cleanup_register(mp, ANY_CONTEXT_OF_YOUR_CODE, ANY_CALLBACK_OF_YOUR_CODE, apr_pool_cleanup_null);

 

posted on 2011-03-31 13:02 肥仔 閱讀(5385) 評論(0)  編輯 收藏 引用 所屬分類: Windows開發(fā)

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            先锋资源久久| 国产精品久久一卡二卡| 99在线|亚洲一区二区| 另类专区欧美制服同性| 久久精品夜夜夜夜久久| 久久久精品tv| 欧美va亚洲va香蕉在线| 亚洲成色777777在线观看影院| 久久久精品五月天| 久久国产日韩欧美| 免费成人高清视频| 欧美日韩成人综合| 国产精品永久在线| 极品尤物一区二区三区| av成人国产| 午夜精品视频在线观看| 免费在线日韩av| 欧美日韩精品免费观看视频| 国产美女精品视频| 亚洲国产高清在线| 亚洲午夜久久久久久久久电影院 | 亚洲国产经典视频| 中文有码久久| 久久久久在线观看| 日韩视频免费在线观看| 亚洲欧洲av一区二区| 毛片一区二区三区| 国产精品嫩草久久久久| 亚洲激情在线激情| 欧美一区午夜精品| 亚洲第一黄网| 欧美一区二区日韩一区二区| 欧美精品在线一区二区| 国产综合网站| 亚洲欧美日韩高清| 亚洲人体一区| 美女主播一区| 极品中文字幕一区| 欧美自拍偷拍午夜视频| 99v久久综合狠狠综合久久| 久久午夜视频| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲乱码国产乱码精品精| 久久九九久久九九| 国产精品免费一区二区三区在线观看| 亚洲国产精品久久久久秋霞影院| 午夜亚洲福利| 9色精品在线| 欧美另类极品videosbest最新版本 | 亚洲第一视频| 久久亚洲捆绑美女| 国内成+人亚洲| 欧美在线视频观看| 亚洲香蕉成视频在线观看| 欧美日韩国产二区| 99热免费精品| 亚洲精品视频免费| 欧美精品 国产精品| 91久久亚洲| 亚洲激情婷婷| 999亚洲国产精| 欧美激情一区二区三区全黄| 亚洲国产一区在线观看| 免费亚洲电影在线| 久久一区欧美| 亚洲黄色毛片| 亚洲欧洲精品一区二区三区波多野1战4 | 亚洲欧美日韩精品久久亚洲区 | 久久九九全国免费精品观看| 激情成人av| 欧美高清视频| 欧美精品日韩三级| 亚洲一区二区在线免费观看视频| 在线中文字幕不卡| 国产精品老女人精品视频| 性色一区二区| 久久精品五月婷婷| 亚洲国内精品在线| 亚洲精品一区二区三区四区高清| 欧美午夜电影完整版| 性娇小13――14欧美| 欧美影院在线| 日韩视频免费在线| 亚洲午夜电影| 在线播放视频一区| 亚洲欧洲在线播放| 国产精品亚洲综合| 欧美成年人视频网站欧美| 欧美国产一区二区| 午夜电影亚洲| 欧美成人精品在线视频| 中文在线一区| 欧美一激情一区二区三区| 亚洲国产aⅴ天堂久久| 99热精品在线观看| 在线播放日韩| 亚洲一区在线直播| 亚洲人成在线播放网站岛国| 亚洲免费一级电影| 亚洲欧洲在线播放| 亚洲欧美日韩国产| 亚洲精品影院在线观看| 午夜视频一区二区| av不卡在线| 久久久久在线| 性欧美暴力猛交另类hd| 女同性一区二区三区人了人一| 亚洲欧美乱综合| 欧美国产日韩免费| 久久免费国产精品1| 欧美午夜在线| 亚洲区国产区| 在线免费观看日韩欧美| 亚洲欧美日韩国产综合| 欧美日韩精品一区视频| 免费久久99精品国产自| 国产精品人人做人人爽| 亚洲三级免费电影| 亚洲第一网站免费视频| 性欧美1819性猛交| 亚洲综合日本| 欧美日韩一级片在线观看| 亚洲大片在线观看| 精品999在线播放| 欧美中文字幕精品| 欧美一区二区视频网站| 国产精品美女久久久浪潮软件| 亚洲精品日韩久久| 亚洲免费电影在线观看| 欧美jizzhd精品欧美喷水| 免费观看一级特黄欧美大片| 伊人成年综合电影网| 欧美永久精品| 浪潮色综合久久天堂| 狠狠入ady亚洲精品| 久久国产精品久久久久久久久久 | 一本一本久久a久久精品综合妖精| 老司机67194精品线观看| 久久成人一区二区| 国产色综合网| 久久国产精品网站| 麻豆av一区二区三区| 在线精品亚洲| 欧美丰满高潮xxxx喷水动漫| 91久久精品国产91性色tv| 日韩午夜av电影| 欧美日韩一区自拍| 亚洲一级网站| 久久性色av| 亚洲乱码精品一二三四区日韩在线 | 国产精品一区三区| 欧美一区二区三区久久精品茉莉花| 久久国产婷婷国产香蕉| 国模 一区 二区 三区| 久久女同互慰一区二区三区| 亚洲高清中文字幕| 亚洲图片欧洲图片av| 国产精品中文在线| 久久久久久久久久久成人| 亚洲高清不卡一区| 亚洲欧美日韩天堂一区二区| 国产欧亚日韩视频| 麻豆精品在线视频| 一区二区三区高清在线| 久久亚洲捆绑美女| 一本大道久久a久久精品综合| 国产精品v欧美精品v日韩 | 麻豆91精品| 这里只有精品视频| 国产婷婷色一区二区三区| 欧美a级一区二区| 香蕉视频成人在线观看| 欧美高清在线观看| 亚洲欧美文学| 欧美日韩一区在线播放| 午夜精品久久久久| 亚洲高清在线观看一区| 久久超碰97人人做人人爱| 亚洲国语精品自产拍在线观看| 国产精品久久久久久av福利软件| 久久一区二区精品| 亚洲综合激情| 亚洲卡通欧美制服中文| 老司机成人在线视频| 亚洲欧美日韩国产一区二区| 91久久久亚洲精品| 国产在线一区二区三区四区| 欧美日韩一区三区四区| 免费国产自线拍一欧美视频| 午夜精品一区二区三区四区 | 欧美中文在线观看国产| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 欧美高清一区二区| 欧美在线高清| 亚洲性视频网址| 亚洲另类在线视频| 有码中文亚洲精品| 国内外成人在线| 国产情侣久久| 国产日韩欧美视频|