亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解析鴻蒙輕內(nèi)核靜態(tài)內(nèi)存的使用

 更新時(shí)間:2021年06月21日 17:02:40   作者:華為云開(kāi)發(fā)者社區(qū)  
摘要:靜態(tài)內(nèi)存實(shí)質(zhì)上是一個(gè)靜態(tài)數(shù)組,靜態(tài)內(nèi)存池內(nèi)的塊大小在初始化時(shí)設(shè)定,初始化后塊大小不可變更。靜態(tài)內(nèi)存池由一個(gè)控制塊和若干相同大小的內(nèi)存塊構(gòu)成??刂茐K位于內(nèi)存池頭部,用于內(nèi)存塊管理。內(nèi)存塊的申請(qǐng)和釋放以塊大小為粒度

一、前言

內(nèi)存管理模塊管理系統(tǒng)的內(nèi)存資源,它是操作系統(tǒng)的核心模塊之一,主要包括內(nèi)存的初始化、分配以及釋放。

在系統(tǒng)運(yùn)行過(guò)程中,內(nèi)存管理模塊通過(guò)對(duì)內(nèi)存的申請(qǐng)/釋放來(lái)管理用戶和OS對(duì)內(nèi)存的使用,使內(nèi)存的利用率和使用效率達(dá)到最優(yōu),同時(shí)最大限度地解決系統(tǒng)的內(nèi)存碎片問(wèn)題。

鴻蒙輕內(nèi)核的內(nèi)存管理分為靜態(tài)內(nèi)存管理和動(dòng)態(tài)內(nèi)存管理,提供內(nèi)存初始化、分配、釋放等功能。

動(dòng)態(tài)內(nèi)存:在動(dòng)態(tài)內(nèi)存池中分配用戶指定大小的內(nèi)存塊。

  • 優(yōu)點(diǎn):按需分配。
  • 缺點(diǎn):內(nèi)存池中可能出現(xiàn)碎片。

靜態(tài)內(nèi)存:在靜態(tài)內(nèi)存池中分配用戶初始化時(shí)預(yù)設(shè)(固定)大小的內(nèi)存塊。

  • 優(yōu)點(diǎn):分配和釋放效率高,靜態(tài)內(nèi)存池中無(wú)碎片。
  • 缺點(diǎn):只能申請(qǐng)到初始化預(yù)設(shè)大小的內(nèi)存塊,不能按需申請(qǐng)。

本文主要分析鴻蒙輕內(nèi)核靜態(tài)內(nèi)存(Memory Box),后續(xù)系列會(huì)繼續(xù)分析動(dòng)態(tài)內(nèi)存。靜態(tài)內(nèi)存實(shí)質(zhì)上是一個(gè)靜態(tài)數(shù)組,靜態(tài)內(nèi)存池內(nèi)的塊大小在初始化時(shí)設(shè)定,初始化后塊大小不可變更。靜態(tài)內(nèi)存池由一個(gè)控制塊和若干相同大小的內(nèi)存塊構(gòu)成??刂茐K位于內(nèi)存池頭部,用于內(nèi)存塊管理。內(nèi)存塊的申請(qǐng)和釋放以塊大小為粒度。

本文通過(guò)分析靜態(tài)內(nèi)存模塊的源碼,幫助讀者掌握靜態(tài)內(nèi)存的使用。本文中所涉及的源碼,以O(shè)penHarmony LiteOS-M內(nèi)核為例,均可以在開(kāi)源站點(diǎn)https://gitee.com/openharmony/kernel_liteos_m獲取。

接下來(lái),我們看下靜態(tài)內(nèi)存的結(jié)構(gòu)體,靜態(tài)內(nèi)存初始化,靜態(tài)內(nèi)存常用操作的源代碼。

二、靜態(tài)內(nèi)存結(jié)構(gòu)體定義和常用宏定義

2.1、靜態(tài)內(nèi)存結(jié)構(gòu)體定義

靜態(tài)內(nèi)存結(jié)構(gòu)體在文件kernel\include\los_membox.h中定義。源代碼如下,⑴處定義的是靜態(tài)內(nèi)存節(jié)點(diǎn)LOS_MEMBOX_NODE結(jié)構(gòu)體,⑵處定義的靜態(tài)內(nèi)存的結(jié)構(gòu)體池信息結(jié)構(gòu)體為L(zhǎng)OS_MEMBOX_INFO,,結(jié)構(gòu)體成員的解釋見(jiàn)注釋部分。

⑴  typedef struct tagMEMBOX_NODE {
        struct tagMEMBOX_NODE *pstNext; /**< 靜態(tài)內(nèi)存池中空閑節(jié)點(diǎn)指針,指向下一個(gè)空閑節(jié)點(diǎn) */
    } LOS_MEMBOX_NODE;

⑵  typedef struct LOS_MEMBOX_INFO {
        UINT32 uwBlkSize;               /**< 靜態(tài)內(nèi)存池中空閑節(jié)點(diǎn)指針,指向下一個(gè)空閑節(jié)點(diǎn) */
        UINT32 uwBlkNum;                /**< 靜態(tài)內(nèi)存池的內(nèi)存塊總數(shù)量 */
        UINT32 uwBlkCnt;                /**< 靜態(tài)內(nèi)存池的已分配的內(nèi)存塊總數(shù)量 */
    #if (LOSCFG_PLATFORM_EXC == 1)
        struct LOS_MEMBOX_INFO *nextMemBox; /**< 指向下一個(gè)靜態(tài)內(nèi)存池 */
    #endif
        LOS_MEMBOX_NODE stFreeList;     /**< 靜態(tài)內(nèi)存池的空閑內(nèi)存塊單向鏈表 */
    } LOS_MEMBOX_INFO;

對(duì)靜態(tài)內(nèi)存使用如下示意圖進(jìn)行說(shuō)明,對(duì)一塊靜態(tài)內(nèi)存區(qū)域,頭部是LOS_MEMBOX_INFO信息,接著是各個(gè)內(nèi)存塊,每塊內(nèi)存塊大小是uwBlkSize,包含內(nèi)存塊節(jié)點(diǎn)LOS_MEMBOX_NODE和內(nèi)存塊數(shù)據(jù)區(qū)??臻e內(nèi)存塊節(jié)點(diǎn)指向下一塊空閑內(nèi)存塊節(jié)點(diǎn)。

2.2、靜態(tài)內(nèi)存常用宏定義

靜態(tài)內(nèi)存頭文件中還提供了一些重要的宏定義。⑴處的LOS_MEMBOX_ALIGNED(memAddr)用于對(duì)齊內(nèi)存地址,⑵處OS_MEMBOX_NEXT(addr, blkSize)根據(jù)當(dāng)前節(jié)點(diǎn)內(nèi)存地址addr和內(nèi)存塊大小blkSize獲取下一個(gè)內(nèi)存塊的內(nèi)存地址。⑶處OS_MEMBOX_NODE_HEAD_SIZE表示內(nèi)存塊中節(jié)點(diǎn)頭大小,每個(gè)內(nèi)存塊包含內(nèi)存節(jié)點(diǎn)LOS_MEMBOX_NODE和存放業(yè)務(wù)的數(shù)據(jù)區(qū)。⑷處表示靜態(tài)內(nèi)存的總大小,包含內(nèi)存池信息結(jié)構(gòu)體占用的大小,和各個(gè)內(nèi)存塊占用的大小。

⑴  #define LOS_MEMBOX_ALIGNED(memAddr) (((UINTPTR)(memAddr) + sizeof(UINTPTR) - 1) & (~(sizeof(UINTPTR) - 1)))

⑵  #define OS_MEMBOX_NEXT(addr, blkSize) (LOS_MEMBOX_NODE *)(VOID *)((UINT8 *)(addr) + (blkSize))

⑶  #define OS_MEMBOX_NODE_HEAD_SIZE sizeof(LOS_MEMBOX_NODE)

⑷  #define LOS_MEMBOX_SIZE(blkSize, blkNum) \
    (sizeof(LOS_MEMBOX_INFO) + (LOS_MEMBOX_ALIGNED((blkSize) + OS_MEMBOX_NODE_HEAD_SIZE) * (blkNum)))

在文件kernel\src\mm\los_membox.c中也定義了一些宏和內(nèi)聯(lián)函數(shù)。⑴處定義OS_MEMBOX_MAGIC魔術(shù)字,這個(gè)32位的魔術(shù)字的后8位維護(hù)任務(wù)編號(hào)信息,任務(wù)編號(hào)位由⑵處的宏定義。⑶處宏定義任務(wù)編號(hào)的最大值,⑷處的宏從魔術(shù)字中提取任務(wù)編號(hào)信息。

⑸處內(nèi)聯(lián)函數(shù)設(shè)置魔術(shù)字,在內(nèi)存塊節(jié)點(diǎn)從靜態(tài)內(nèi)存池中分配出來(lái)后,節(jié)點(diǎn)指針.pstNext不再指向下一個(gè)空閑內(nèi)存塊節(jié)點(diǎn),而是設(shè)置為魔術(shù)字。⑹處的內(nèi)聯(lián)函數(shù)用于校驗(yàn)?zāi)g(shù)字。⑺處的宏根據(jù)內(nèi)存塊的節(jié)點(diǎn)地址獲取內(nèi)存塊的數(shù)據(jù)區(qū)地址,⑻處的宏根據(jù)內(nèi)存塊的數(shù)據(jù)區(qū)地址獲取內(nèi)存塊的節(jié)點(diǎn)地址。

⑴  #define OS_MEMBOX_MAGIC         0xa55a5a00

⑵  #define OS_MEMBOX_TASKID_BITS   8

⑶  #define OS_MEMBOX_MAX_TASKID    ((1 << OS_MEMBOX_TASKID_BITS) - 1)

⑷  #define OS_MEMBOX_TASKID_GET(addr) (((UINTPTR)(addr)) & OS_MEMBOX_MAX_TASKID)

⑸  STATIC INLINE VOID OsMemBoxSetMagic(LOS_MEMBOX_NODE *node)
    {
        UINT8 taskID = (UINT8)LOS_CurTaskIDGet();
        node->pstNext = (LOS_MEMBOX_NODE *)(OS_MEMBOX_MAGIC | taskID);
    }

⑹  STATIC INLINE UINT32 OsMemBoxCheckMagic(LOS_MEMBOX_NODE *node)
    {
        UINT32 taskID = OS_MEMBOX_TASKID_GET(node->pstNext);
        if (taskID > (LOSCFG_BASE_CORE_TSK_LIMIT + 1)) {
            return LOS_NOK;
        } else {
            return (node->pstNext == (LOS_MEMBOX_NODE *)(OS_MEMBOX_MAGIC | taskID)) ? LOS_OK : LOS_NOK;
        }
    }

⑺  #define OS_MEMBOX_USER_ADDR(addr) \
        ((VOID *)((UINT8 *)(addr) + OS_MEMBOX_NODE_HEAD_SIZE))

⑻  #define OS_MEMBOX_NODE_ADDR(addr) \
        ((LOS_MEMBOX_NODE *)(VOID *)((UINT8 *)(addr) - OS_MEMBOX_NODE_HEAD_SIZE))

三、靜態(tài)內(nèi)存常用操作

當(dāng)用戶需要使用固定長(zhǎng)度的內(nèi)存時(shí),可以通過(guò)靜態(tài)內(nèi)存分配的方式獲取內(nèi)存,一旦使用完畢,通過(guò)靜態(tài)內(nèi)存釋放函數(shù)歸還所占用內(nèi)存,使之可以重復(fù)使用。

3.1、初始化靜態(tài)內(nèi)存池

我們分析下初始化靜態(tài)內(nèi)存池函數(shù)UINT32 LOS_MemboxInit(VOID *pool, UINT32 poolSize, UINT32 blkSize)的代碼。我們先看看函數(shù)參數(shù),VOID *pool是靜態(tài)內(nèi)存池的起始地址,UINT32 poolSize是初始化的靜態(tài)內(nèi)存池的總大小,poolSize需要小于等于*pool開(kāi)始的內(nèi)存區(qū)域的大小,否則會(huì)影響后面的內(nèi)存區(qū)域。還需要大于靜態(tài)內(nèi)存的頭部大小sizeof(LOS_MEMBOX_INFO)。長(zhǎng)度UINT32 blkSize是靜態(tài)內(nèi)存池中的每個(gè)內(nèi)存塊的塊大小。

我們看下代碼,⑴處對(duì)傳入?yún)?shù)進(jìn)行校驗(yàn)。⑵處設(shè)置靜態(tài)內(nèi)存池中每個(gè)內(nèi)存塊的實(shí)際大小,已內(nèi)存對(duì)齊,也算上內(nèi)存塊中節(jié)點(diǎn)信息。⑶處計(jì)算內(nèi)存池中內(nèi)存塊的總數(shù)量,然后設(shè)置已用內(nèi)存塊數(shù)量.uwBlkCnt為0。
⑷處如果可用的內(nèi)存塊為0,返回初始化失敗。⑸處獲取內(nèi)存池中的第一個(gè)空閑內(nèi)存塊節(jié)點(diǎn)。⑹處把空閑內(nèi)存塊掛載在靜態(tài)內(nèi)存池信息結(jié)構(gòu)體空閑內(nèi)存塊鏈表stFreeList.pstNext上,然后執(zhí)行⑺每個(gè)空閑內(nèi)存塊依次指向下一個(gè)空閑內(nèi)存塊,鏈接起來(lái)。

UINT32 LOS_MemboxInit(VOID *pool, UINT32 poolSize, UINT32 blkSize)
{
    LOS_MEMBOX_INFO *boxInfo = (LOS_MEMBOX_INFO *)pool;
    LOS_MEMBOX_NODE *node = NULL;
    UINT32 index;
    UINT32 intSave;

⑴  if (pool == NULL) {
        return LOS_NOK;
    }

    if (blkSize == 0) {
        return LOS_NOK;
    }

    if (poolSize < sizeof(LOS_MEMBOX_INFO)) {
        return LOS_NOK;
    }

    MEMBOX_LOCK(intSave);
⑵  boxInfo->uwBlkSize = LOS_MEMBOX_ALIGNED(blkSize + OS_MEMBOX_NODE_HEAD_SIZE);
    if (boxInfo->uwBlkSize == 0) {
        MEMBOX_UNLOCK(intSave);
        return LOS_NOK;
    }
⑶  boxInfo->uwBlkNum = (poolSize - sizeof(LOS_MEMBOX_INFO)) / boxInfo->uwBlkSize;
    boxInfo->uwBlkCnt = 0;
⑷  if (boxInfo->uwBlkNum == 0) {
        MEMBOX_UNLOCK(intSave);
        return LOS_NOK;
    }

⑸  node = (LOS_MEMBOX_NODE *)(boxInfo + 1);

⑹  boxInfo->stFreeList.pstNext = node;

⑺  for (index = 0; index < boxInfo->uwBlkNum - 1; ++index) {
        node->pstNext = OS_MEMBOX_NEXT(node, boxInfo->uwBlkSize);
        node = node->pstNext;
    }

    node->pstNext = NULL;

#if (LOSCFG_PLATFORM_EXC == 1)
    OsMemBoxAdd(pool);
#endif

    MEMBOX_UNLOCK(intSave);

    return LOS_OK;
}

3.2、清除靜態(tài)內(nèi)存塊內(nèi)容

我們可以使用函數(shù)VOID LOS_MemboxClr(VOID *pool, VOID *box)來(lái)清除靜態(tài)內(nèi)存塊中的數(shù)據(jù)區(qū)內(nèi)容,需要2個(gè)參數(shù),VOID *pool是初始化過(guò)的靜態(tài)內(nèi)存池地址。VOID *box是需要清除內(nèi)容的靜態(tài)內(nèi)存塊的數(shù)據(jù)區(qū)的起始地址,注意這個(gè)不是內(nèi)存塊的節(jié)點(diǎn)地址,每個(gè)內(nèi)存塊的節(jié)點(diǎn)區(qū)不能清除。下面分析下源碼。

⑴處對(duì)參數(shù)進(jìn)行校驗(yàn),⑵處調(diào)用memset_s()函數(shù)把內(nèi)存塊的數(shù)據(jù)區(qū)寫(xiě)入0。寫(xiě)入的開(kāi)始地址是內(nèi)存塊的數(shù)據(jù)區(qū)的起始地址VOID *box,寫(xiě)入長(zhǎng)度是數(shù)據(jù)區(qū)的長(zhǎng)度boxInfo->uwBlkSize - OS_MEMBOX_NODE_HEAD_SIZE。

VOID LOS_MemboxClr(VOID *pool, VOID *box)
{
    LOS_MEMBOX_INFO *boxInfo = (LOS_MEMBOX_INFO *)pool;

⑴  if ((pool == NULL) || (box == NULL)) {
        return;
    }

⑵  (VOID)memset_s(box, (boxInfo->uwBlkSize - OS_MEMBOX_NODE_HEAD_SIZE), 0,
                   (boxInfo->uwBlkSize - OS_MEMBOX_NODE_HEAD_SIZE));
}

3.3、申請(qǐng)、釋放靜態(tài)內(nèi)存

初始化靜態(tài)內(nèi)存池后,我們可以使用函數(shù)VOID *LOS_MemboxAlloc(VOID *pool)來(lái)申請(qǐng)靜態(tài)內(nèi)存,下面分析下源碼。

⑴處獲取靜態(tài)內(nèi)存池空閑內(nèi)存塊鏈表頭結(jié)點(diǎn),如果鏈表不為空,執(zhí)行⑵,把下一個(gè)可用節(jié)點(diǎn)賦值給nodeTmp。⑶處把鏈表頭結(jié)點(diǎn)執(zhí)行下一個(gè)的下一個(gè)鏈表節(jié)點(diǎn),然后執(zhí)行⑷把分配出來(lái)的內(nèi)存塊設(shè)置魔術(shù)字,接著把內(nèi)存池已用內(nèi)存塊數(shù)量加1。⑸處返回時(shí)調(diào)用宏OS_MEMBOX_USER_ADDR()計(jì)算出內(nèi)存塊的數(shù)據(jù)區(qū)域地質(zhì)。

VOID *LOS_MemboxAlloc(VOID *pool)
{
    LOS_MEMBOX_INFO *boxInfo = (LOS_MEMBOX_INFO *)pool;
    LOS_MEMBOX_NODE *node = NULL;
    LOS_MEMBOX_NODE *nodeTmp = NULL;
    UINT32 intSave;

    if (pool == NULL) {
        return NULL;
    }

    MEMBOX_LOCK(intSave);
⑴  node = &(boxInfo->stFreeList);
    if (node->pstNext != NULL) {
⑵      nodeTmp = node->pstNext;
⑶      node->pstNext = nodeTmp->pstNext;
⑷      OsMemBoxSetMagic(nodeTmp);
        boxInfo->uwBlkCnt++;
    }
    MEMBOX_UNLOCK(intSave);

⑸  return (nodeTmp == NULL) ? NULL : OS_MEMBOX_USER_ADDR(nodeTmp);
}

對(duì)申請(qǐng)的內(nèi)存塊使用完畢,我們可以使用函數(shù)UINT32 LOS_MemboxFree(VOID *pool, VOID *box)來(lái)釋放靜態(tài)內(nèi)存,需要2個(gè)參數(shù),VOID *pool是初始化過(guò)的靜態(tài)內(nèi)存池地址。VOID *box是需要釋放的靜態(tài)內(nèi)存塊的數(shù)據(jù)區(qū)的起始地址,注意這個(gè)不是內(nèi)存塊的節(jié)點(diǎn)地址。下面分析下源碼。

⑴處根據(jù)待釋放的內(nèi)存塊的數(shù)據(jù)區(qū)域地址獲取節(jié)點(diǎn)地址node,⑵對(duì)要釋放的內(nèi)存塊先進(jìn)行校驗(yàn)。⑶處把要釋放的內(nèi)存塊掛在內(nèi)存池空閑內(nèi)存塊鏈表上,然后執(zhí)行⑷把已用數(shù)量減1。

LITE_OS_SEC_TEXT UINT32 LOS_MemboxFree(VOID *pool, VOID *box)
{
    LOS_MEMBOX_INFO *boxInfo = (LOS_MEMBOX_INFO *)pool;
    UINT32 ret = LOS_NOK;
    UINT32 intSave;

    if ((pool == NULL) || (box == NULL)) {
        return LOS_NOK;
    }

    MEMBOX_LOCK(intSave);
    do {
⑴      LOS_MEMBOX_NODE *node = OS_MEMBOX_NODE_ADDR(box);
⑵      if (OsCheckBoxMem(boxInfo, node) != LOS_OK) {
            break;
        }

⑶      node->pstNext = boxInfo->stFreeList.pstNext;
        boxInfo->stFreeList.pstNext = node;
⑷      boxInfo->uwBlkCnt--;
        ret = LOS_OK;
    } while (0);
    MEMBOX_UNLOCK(intSave);

    return ret;
}

接下來(lái),我們?cè)倏纯葱r?yàn)函數(shù)OsCheckBoxMem()。⑴如果內(nèi)存池的塊大小為0,返回校驗(yàn)失敗。⑵處計(jì)算出要釋放的內(nèi)存快節(jié)點(diǎn)相對(duì)第一個(gè)內(nèi)存塊節(jié)點(diǎn)的偏移量offset。⑶如果偏移量除以內(nèi)存塊數(shù)量余數(shù)不為0,返回校驗(yàn)失敗。⑷如果偏移量除以內(nèi)存塊數(shù)量的商大于等于內(nèi)存塊的數(shù)量,返回校驗(yàn)失敗。⑸調(diào)用宏OsMemBoxCheckMagic校驗(yàn)?zāi)g(shù)字。

STATIC INLINE UINT32 OsCheckBoxMem(const LOS_MEMBOX_INFO *boxInfo, const VOID *node)
{
    UINT32 offset;

⑴  if (boxInfo->uwBlkSize == 0) {
        return LOS_NOK;
    }

⑵  offset = (UINT32)((UINTPTR)node - (UINTPTR)(boxInfo + 1));
⑶  if ((offset % boxInfo->uwBlkSize) != 0) {
        return LOS_NOK;
    }

⑷  if ((offset / boxInfo->uwBlkSize) >= boxInfo->uwBlkNum) {
        return LOS_NOK;
    }

⑸   return OsMemBoxCheckMagic((LOS_MEMBOX_NODE *)node);
}

四、小結(jié)

本文帶領(lǐng)大家一起剖析了鴻蒙輕內(nèi)核的靜態(tài)內(nèi)存模塊的源代碼,包含靜態(tài)內(nèi)存的結(jié)構(gòu)體、靜態(tài)內(nèi)存池初始化、靜態(tài)內(nèi)存申請(qǐng)、釋放、清除內(nèi)容等。為了更容易找到鴻蒙輕內(nèi)核代碼倉(cāng),建議訪問(wèn)https://gitee.com/openharmony/kernel_liteos_m

以上就是解析鴻蒙輕內(nèi)核靜態(tài)內(nèi)存的使用的詳細(xì)內(nèi)容,更多關(guān)于鴻蒙輕內(nèi)核靜態(tài)內(nèi)存的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • bloom filter概念講解以及代碼分析

    bloom filter概念講解以及代碼分析

    Bloom filter 優(yōu)點(diǎn)就是它的插入和查詢時(shí)間都是常數(shù),另外它查詢?cè)貐s不保存元素本身,具有良好的安全性
    2013-09-09
  • C++中如何實(shí)現(xiàn)回調(diào)的方法示例

    C++中如何實(shí)現(xiàn)回調(diào)的方法示例

    這篇文章主要給大家介紹了關(guān)于C++中如何實(shí)現(xiàn)回調(diào)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用c++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-10-10
  • C++ 函數(shù)重載詳情介紹

    C++ 函數(shù)重載詳情介紹

    這篇文章主要介紹了C++ 函數(shù)重載詳情,函數(shù)重載還有一個(gè)別名叫函數(shù)多態(tài),函數(shù)多態(tài)是C++在C語(yǔ)言基礎(chǔ)上的新特性,它可以讓我們使用多個(gè)同名函數(shù),下面來(lái)看看文章具體內(nèi)容的介紹
    2021-11-11
  • C++實(shí)現(xiàn)LeetCode(88.混合插入有序數(shù)組)

    C++實(shí)現(xiàn)LeetCode(88.混合插入有序數(shù)組)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(88.混合插入有序數(shù)組),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言 選擇排序算法詳解及實(shí)現(xiàn)代碼

    C語(yǔ)言 選擇排序算法詳解及實(shí)現(xiàn)代碼

    本文主要介紹C語(yǔ)言 選擇排序算法,這里對(duì)排序算法做了詳細(xì)說(shuō)明,并附代碼示例,有需要的小伙伴可以參考下
    2016-08-08
  • C++關(guān)于/2和>>1的區(qū)別說(shuō)明

    C++關(guān)于/2和>>1的區(qū)別說(shuō)明

    這篇文章主要介紹了C++關(guān)于/2和>>1的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 利用C++模擬實(shí)現(xiàn)STL容器:list

    利用C++模擬實(shí)現(xiàn)STL容器:list

    列表是一種順序容器,它允許在序列中的任何位置執(zhí)行常量時(shí)間插入和刪除操作,并允許在兩個(gè)方向上進(jìn)行迭代。本文將利用C++模擬實(shí)現(xiàn)list,希望對(duì)大家有所幫助
    2022-12-12
  • 利用C語(yǔ)言實(shí)現(xiàn)經(jīng)典游戲斗獸棋

    利用C語(yǔ)言實(shí)現(xiàn)經(jīng)典游戲斗獸棋

    《斗獸棋》是一款棋類游戲,整個(gè)游戲畫(huà)面是分為兩塊區(qū)域,中間有河流分割兩塊區(qū)域,有橋梁可以讓彼此的動(dòng)物過(guò)河,要取得勝利,必須占領(lǐng)那一邊動(dòng)物的巢穴獲勝利。本文將用C語(yǔ)言實(shí)現(xiàn)這一游戲,需要的可以參考一下
    2022-03-03
  • C++輸出上三角/下三角/菱形/楊輝三角形(實(shí)現(xiàn)代碼)

    C++輸出上三角/下三角/菱形/楊輝三角形(實(shí)現(xiàn)代碼)

    本篇文章是對(duì)C++中輸出上三角/下三角/菱形/楊輝三角形的示例代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-07-07
  • c語(yǔ)言中static的用法詳細(xì)示例分析

    c語(yǔ)言中static的用法詳細(xì)示例分析

    以下是對(duì)c語(yǔ)言中static函數(shù)的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08

最新評(píng)論