精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度解析鴻蒙內(nèi)核最重要的結(jié)構(gòu)體

鴻蒙系統(tǒng)HarmonyOS ? 來(lái)源:my.oschina ? 作者:鴻蒙內(nèi)核源碼分析 ? 2021-04-25 11:58 ? 次閱讀

誰(shuí)是鴻蒙內(nèi)核最重要的結(jié)構(gòu)體?

答案一定是:LOS_DL_LIST(雙向鏈表),它長(zhǎng)這樣.

typedef struct LOS_DL_LIST {//雙向鏈表,內(nèi)核最重要結(jié)構(gòu)體
    struct LOS_DL_LIST *pstPrev; /**< Current node's pointer to the previous node *///前驅(qū)節(jié)點(diǎn)(左手)
    struct LOS_DL_LIST *pstNext; /**< Current node's pointer to the next node *///后繼節(jié)點(diǎn)(右手)
} LOS_DL_LIST;

結(jié)構(gòu)體夠簡(jiǎn)單了吧,只有前后兩個(gè)指向自己的指針,但恰恰是因?yàn)樘?jiǎn)單,所以才太不簡(jiǎn)單. 就像氫原子一樣,宇宙中無(wú)處不在,占比最高,原因是因?yàn)樗詈?jiǎn)單,最穩(wěn)定!

內(nèi)核的各自模塊都能看到雙向鏈表的身影,下圖是各處初始化雙向鏈表的操作,因?yàn)樘嗔?只截取了部分:

pIYBAGCE6DKAAf-bAARvRfH2FV4405.png

很多人問(wèn)圖怎么來(lái)的,source insight 4.0是閱讀大型C/C++工程的必備工具,要用4.0否則中文有亂碼.

可以豪不夸張的說(shuō)理解LOS_DL_LIST及相關(guān)函數(shù)是讀懂鴻蒙內(nèi)核的關(guān)鍵。前后指針(注者后續(xù)將比喻成一對(duì)左右觸手)靈活的指揮著系統(tǒng)精準(zhǔn)的運(yùn)行,越是深入分析內(nèi)核源碼,越能感受到內(nèi)核開(kāi)發(fā)者對(duì)LOS_DL_LIST非凡的駕馭能力,筆者仿佛看到了無(wú)數(shù)雙手前后相連,拉起了一個(gè)個(gè)雙向循環(huán)鏈表,把指針的高效能運(yùn)用到了極致,這也許就是編程的藝術(shù)吧!這么重要的結(jié)構(gòu)體還是需詳細(xì)講解一下.

基本概念

雙向鏈表是指含有往前和往后兩個(gè)方向的鏈表,即每個(gè)結(jié)點(diǎn)中除存放下一個(gè)節(jié)點(diǎn)指針外,還增加一個(gè)指向其前一個(gè)節(jié)點(diǎn)的指針。其頭指針head是唯一確定的。從雙向鏈表中的任意一個(gè)結(jié)點(diǎn)開(kāi)始,都可以很方便地訪問(wèn)它的前驅(qū)結(jié)點(diǎn)和后繼結(jié)點(diǎn),這種數(shù)據(jù)結(jié)構(gòu)形式使得雙向鏈表在查找時(shí)更加方便,特別是大量數(shù)據(jù)的遍歷。由于雙向鏈表具有對(duì)稱性,能方便地完成各種插入、刪除等操作,但需要注意前后方向的操作。

有好幾個(gè)同學(xué)問(wèn)數(shù)據(jù)在哪? 確實(shí)LOS_DL_LIST這個(gè)結(jié)構(gòu)看起來(lái)怪怪的,它竟沒(méi)有數(shù)據(jù)域!所以看到這個(gè)結(jié)構(gòu)的人第一反應(yīng)就是我們?cè)趺丛L問(wèn)數(shù)據(jù)?其實(shí)LOS_DL_LIST不是拿來(lái)單獨(dú)用的,它是寄生在內(nèi)容結(jié)構(gòu)體上的,誰(shuí)用它誰(shuí)就是它的數(shù)據(jù).看圖就明白了.

pIYBAGCE6EaAToV1AADMtl72i_g471.png

功能接口

鴻蒙系統(tǒng)中的雙向鏈表模塊為用戶提供下面幾個(gè)接口。

pIYBAGCE6FOAL5ATAAEsiAQ3PvI596.png

請(qǐng)結(jié)合下面的代碼和圖去理解雙向鏈表,不管花多少時(shí)間,一定要理解它的插入/刪除動(dòng)作,否則后續(xù)內(nèi)容將無(wú)從談起.

//將指定節(jié)點(diǎn)初始化為雙向鏈表節(jié)點(diǎn)
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListInit(LOS_DL_LIST *list)
{
    list->pstNext = list;
    list->pstPrev = list;
}

//將指定節(jié)點(diǎn)掛到雙向鏈表頭部
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListAdd(LOS_DL_LIST *list, LOS_DL_LIST *node)
{
    node->pstNext = list->pstNext;
    node->pstPrev = list;
    list->pstNext->pstPrev = node;
    list->pstNext = node;
}
//將指定節(jié)點(diǎn)從鏈表中刪除,自己把自己摘掉
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
{
    node->pstNext->pstPrev = node->pstPrev;
    node->pstPrev->pstNext = node->pstNext;
    node->pstNext = NULL;
    node->pstPrev = NULL;
}

pIYBAGCE6GqAMe0lAAHgHk5dkIE576.png

強(qiáng)大的宏

除了內(nèi)聯(lián)函數(shù),對(duì)雙向遍歷的初始化,定位,遍歷 等等操作提供了更強(qiáng)大的宏支持.使內(nèi)核以極其簡(jiǎn)潔高效的代碼實(shí)現(xiàn)復(fù)雜邏輯的處理.

//定義一個(gè)節(jié)點(diǎn)并初始化為雙向鏈表節(jié)點(diǎn)
#define LOS_DL_LIST_HEAD(list) LOS_DL_LIST list = { &(list), &(list) }

//獲取指定結(jié)構(gòu)體內(nèi)的成員相對(duì)于結(jié)構(gòu)體起始地址的偏移量
#define LOS_OFF_SET_OF(type, member) ((UINTPTR)&((type *)0)->member)

//獲取包含鏈表的結(jié)構(gòu)體地址,接口的第一個(gè)入?yún)⒈硎镜氖擎湵碇械哪硞€(gè)節(jié)點(diǎn),第二個(gè)入?yún)⑹且@取的結(jié)構(gòu)體名稱,第三個(gè)入?yún)⑹擎湵碓谠摻Y(jié)構(gòu)體中的名稱
#define LOS_DL_LIST_ENTRY(item, type, member) \
    ((type *)(VOID *)((CHAR *)(item) - LOS_OFF_SET_OF(type, member)))

//遍歷雙向鏈表
#define LOS_DL_LIST_FOR_EACH(item, list) \
    for (item = (list)->pstNext;         \
         (item) != (list);               \
         item = (item)->pstNext)

//遍歷指定雙向鏈表,獲取包含該鏈表節(jié)點(diǎn)的結(jié)構(gòu)體地址,并存儲(chǔ)包含當(dāng)前節(jié)點(diǎn)的后繼節(jié)點(diǎn)的結(jié)構(gòu)體地址
#define LOS_DL_LIST_FOR_EACH_ENTRY_SAFE(item, next, list, type, member)               \
    for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member),                     \
         next = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member);              \
         &(item)->member != (list);                                                   \
         item = next, next = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member))

//遍歷指定雙向鏈表,獲取包含該鏈表節(jié)點(diǎn)的結(jié)構(gòu)體地址
#define LOS_DL_LIST_FOR_EACH_ENTRY(item, list, type, member)             \
    for (item = LOS_DL_LIST_ENTRY((list)->pstNext, type, member);        \
         &(item)->member != (list);                                      \
         item = LOS_DL_LIST_ENTRY((item)->member.pstNext, type, member))

例如在調(diào)度算法中獲取當(dāng)前最高優(yōu)先級(jí)的任務(wù)時(shí),就需要遍歷整個(gè)進(jìn)程和進(jìn)程任務(wù)的所有就緒列表.LOS_DL_LIST_FOR_EACH_ENTRY高效的解決了層層循環(huán)的問(wèn)題,讓代碼簡(jiǎn)潔易懂.

LITE_OS_SEC_TEXT_MINOR LosTaskCB *OsGetTopTask(VOID)
{
    UINT32 priority, processPriority;
    UINT32 bitmap;
    UINT32 processBitmap;
    LosTaskCB *newTask = NULL;
#if (LOSCFG_KERNEL_SMP == YES)
    UINT32 cpuid = ArchCurrCpuid();
#endif
    LosProcessCB *processCB = NULL;
    processBitmap = g_priQueueBitmap;
    while (processBitmap) {
        processPriority = CLZ(processBitmap);
        LOS_DL_LIST_FOR_EACH_ENTRY(processCB, &g_priQueueList[processPriority], LosProcessCB, pendList) {
            bitmap = processCB->threadScheduleMap;
            while (bitmap) {
                priority = CLZ(bitmap);
                LOS_DL_LIST_FOR_EACH_ENTRY(newTask, &processCB->threadPriQueueList[priority], LosTaskCB, pendList) {
#if (LOSCFG_KERNEL_SMP == YES)
                    if (newTask->cpuAffiMask & (1U << cpuid)) {
#endif
                        newTask->taskStatus &= ~OS_TASK_STATUS_READY;
                        OsPriQueueDequeue(processCB->threadPriQueueList,
                                          &processCB->threadScheduleMap,
                                          &newTask->pendList);
                        OsDequeEmptySchedMap(processCB);
                        goto OUT;
#if (LOSCFG_KERNEL_SMP == YES)
                    }
#endif
                }
                bitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - priority - 1));
            }
        }
        processBitmap &= ~(1U << (OS_PRIORITY_QUEUE_NUM - processPriority - 1));
    }

OUT:
    return newTask;
}

結(jié)構(gòu)體的最愛(ài)

LOS_DL_LIST是復(fù)雜結(jié)構(gòu)體的最愛(ài),以下舉例ProcessCB(進(jìn)程控制塊)是描述一個(gè)進(jìn)程的所有信息,其中用到了 8個(gè)雙向鏈表,這簡(jiǎn)直比章魚還牛逼,章魚也才四雙觸手,但進(jìn)程有8雙(16只)觸手.

typedef struct ProcessCB {
    //...此處省略其他變量
    LOS_DL_LIST          pendList;                     /**< Block list to which the process belongs */ //進(jìn)程所屬的阻塞列表,如果因拿鎖失敗,就由此節(jié)點(diǎn)掛到等鎖鏈表上
    LOS_DL_LIST          childrenList;                 /**< my children process list */	//孩子進(jìn)程都掛到這里,形成雙循環(huán)鏈表
    LOS_DL_LIST          exitChildList;                /**< my exit children process list */	//那些要退出孩子進(jìn)程掛到這里,白發(fā)人送黑發(fā)人。
    LOS_DL_LIST          siblingList;                  /**< linkage in my parent's children list */ //兄弟進(jìn)程鏈表, 56個(gè)民族是一家,來(lái)自同一個(gè)父進(jìn)程.
    LOS_DL_LIST          subordinateGroupList;         /**< linkage in my group list */ //進(jìn)程是組長(zhǎng)時(shí),有哪些組員進(jìn)程
    LOS_DL_LIST          threadSiblingList;            /**< List of threads under this process *///進(jìn)程的線程(任務(wù))列表
    LOS_DL_LIST          threadPriQueueList[OS_PRIORITY_QUEUE_NUM]; /**< The process's thread group schedules thepriority hash table */	//進(jìn)程的線程組調(diào)度優(yōu)先級(jí)哈希表
    LOS_DL_LIST          waitList;     /**< The process holds the waitLits to support wait/waitpid *///進(jìn)程持有等待鏈表以支持wait/waitpid
} LosProcessCB;

解讀

pendList個(gè)人認(rèn)為它是鴻蒙內(nèi)核功能最多的一個(gè)鏈表,它遠(yuǎn)不止字面意思阻塞鏈表這么簡(jiǎn)單,只有深入解讀源碼后才能體會(huì)它真的是太會(huì)來(lái)事了,一般把它理解為阻塞鏈表就行.上面掛的是處于阻塞狀態(tài)的進(jìn)程.

childrenList孩子鏈表,所有由它fork出來(lái)的進(jìn)程都掛到這個(gè)鏈表上.上面的孩子進(jìn)程在死亡前會(huì)將自己從上面摘出去,轉(zhuǎn)而掛到exitChildList鏈表上.

exitChildList退出孩子鏈表,進(jìn)入死亡程序的進(jìn)程要掛到這個(gè)鏈表上,一個(gè)進(jìn)程的死亡是件挺麻煩的事,進(jìn)程池的數(shù)量有限,需要及時(shí)回收進(jìn)程資源,但家族管理關(guān)系復(fù)雜,要去很多地方消除痕跡.尤其還有其他進(jìn)程在看你笑話,等你死亡(wait/waitpid)了通知它們一聲.

siblingList兄弟鏈表,和你同一個(gè)父親的進(jìn)程都掛到了這個(gè)鏈表上.

subordinateGroupList朋友圈鏈表,里面是因?yàn)榕d趣愛(ài)好(進(jìn)程組)而掛在一起的進(jìn)程,它們可以不是一個(gè)父親,不是一個(gè)祖父,但一定是同一個(gè)老祖宗(用戶態(tài)和內(nèi)核態(tài)根進(jìn)程).

threadSiblingList線程鏈表,上面掛的是進(jìn)程ID都是這個(gè)進(jìn)程的線程(任務(wù)),進(jìn)程和線程的關(guān)系是1:N的關(guān)系,一個(gè)線程只能屬于一個(gè)進(jìn)程.這里要注意任務(wù)在其生命周期中是不能改所屬進(jìn)程的.

threadPriQueueList線程的調(diào)度隊(duì)列數(shù)組,一共32個(gè),任務(wù)和進(jìn)程一樣有32個(gè)優(yōu)先級(jí),調(diào)度算法的過(guò)程是先找到優(yōu)先級(jí)最高的進(jìn)程,在從該進(jìn)程的任務(wù)隊(duì)列里去最高的優(yōu)先級(jí)任務(wù)運(yùn)行.

waitList是等待子進(jìn)程消亡的任務(wù)鏈表,注意上面掛的是任務(wù).任務(wù)是通過(guò)系統(tǒng)調(diào)用

  pid_t wait(int *status);
  pid_t waitpid(pid_t pid, int *status, int options);
將任務(wù)掛到waitList上.鴻蒙waitpid系統(tǒng)調(diào)用為SysWait,具體看進(jìn)程回收篇.

雙向鏈表是內(nèi)核最重要的結(jié)構(gòu)體,精讀內(nèi)核的路上它會(huì)反復(fù)的映入你的眼簾,理解它是理解內(nèi)核運(yùn)作的關(guān)鍵所在!

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1363

    瀏覽量

    40228
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2634

    瀏覽量

    66220
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    結(jié)構(gòu)成員的順序會(huì)影響結(jié)構(gòu)的大小嗎

    相同的結(jié)構(gòu)成員,如果把順序調(diào)整一下,會(huì)不會(huì)影響結(jié)構(gòu)的大小? 答案是會(huì)的,這主要跟字節(jié)對(duì)齊有關(guān)。 比如這樣的結(jié)構(gòu)
    的頭像 發(fā)表于 11-25 16:24 ?42次閱讀

    溫度補(bǔ)償振蕩器TG-3541CE的深度解析

    溫度補(bǔ)償振蕩器TG-3541CE的深度解析
    的頭像 發(fā)表于 07-18 17:48 ?296次閱讀

    深度神經(jīng)網(wǎng)絡(luò)(DNN)架構(gòu)解析與優(yōu)化策略

    深度神經(jīng)網(wǎng)絡(luò)(Deep Neural Network, DNN)作為機(jī)器學(xué)習(xí)領(lǐng)域中的一種重要技術(shù),以其強(qiáng)大的特征學(xué)習(xí)能力和非線性建模能力,在多個(gè)領(lǐng)域取得了顯著成果。DNN的核心在于其多層結(jié)構(gòu),通過(guò)
    的頭像 發(fā)表于 07-09 11:00 ?1566次閱讀

    華為鴻蒙內(nèi)核獲中國(guó)信通院自主成熟度A級(jí)認(rèn)證

    在科技創(chuàng)新的浪潮中,華為再次以其卓越的自主研發(fā)能力引領(lǐng)行業(yè)前行。近日,中國(guó)信息通信研究院(簡(jiǎn)稱“中國(guó)信通院”)官方公眾號(hào)宣布了一項(xiàng)重要成果:華為技術(shù)有限公司的鴻蒙內(nèi)核成功通過(guò)了自主成熟度等級(jí)認(rèn)證
    的頭像 發(fā)表于 07-03 14:32 ?606次閱讀

    歡創(chuàng)播報(bào) 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核

    1 華為宣布鴻蒙內(nèi)核已超越Linux內(nèi)核 ? 6月21日,在華為開(kāi)發(fā)者大會(huì)上, HarmonyOS NEXT(鴻蒙NEXT)——真正獨(dú)立于安卓和iOS的
    的頭像 發(fā)表于 06-27 11:30 ?782次閱讀

    PLC基本結(jié)構(gòu)解析

    方式和便捷的編程方式,被廣泛應(yīng)用于各種工業(yè)控制系統(tǒng)中。本文將詳細(xì)解析PLC的基本結(jié)構(gòu),包括其主要組成部分的功能和特點(diǎn),以便讀者對(duì)PLC有更深入的了解。
    的頭像 發(fā)表于 06-25 14:30 ?831次閱讀

    華為發(fā)布鴻蒙原生智能,OS深度融合AI,小藝升級(jí)為系統(tǒng)級(jí)智能

    Beta。鴻蒙原生智能是基于軟硬芯云協(xié)同的硬件與基礎(chǔ)設(shè)施架構(gòu),AI與OS深度融合的智能系統(tǒng)。 小藝智能:能思考,會(huì)規(guī)劃,可執(zhí)行 基于鴻蒙原生智能強(qiáng)大的AI底座,搭載盤古大模型,小藝升
    的頭像 發(fā)表于 06-24 14:30 ?493次閱讀
    華為發(fā)布<b class='flag-5'>鴻蒙</b>原生智能,OS<b class='flag-5'>深度</b>融合AI,小藝升級(jí)為系統(tǒng)級(jí)智能<b class='flag-5'>體</b>

    HDC2024華為發(fā)布鴻蒙原生智能:AI與OS深度融合,開(kāi)啟全新的AI時(shí)代

    6月21日,華為開(kāi)發(fā)者大會(huì)2024(HDC.2024)召開(kāi)。 HarmonyOS NEXT將AI與OS深度融合,構(gòu)筑全新鴻蒙原生智能框架。大會(huì)現(xiàn)場(chǎng),華為常務(wù)董事、終端BG董事長(zhǎng)、智能汽車解決方案BU
    的頭像 發(fā)表于 06-24 09:28 ?590次閱讀
    HDC2024華為發(fā)布<b class='flag-5'>鴻蒙</b>原生智能:AI與OS<b class='flag-5'>深度</b>融合,開(kāi)啟全新的AI時(shí)代

    【JAVA UI】【HarmonyOS】【Demo】 鴻蒙如何進(jìn)行 xml 解析

    鴻蒙鴻蒙如何進(jìn)行數(shù)據(jù)解析 【問(wèn)題描述】有時(shí)候我們從服務(wù)器獲取是 xml 格式數(shù)據(jù),我們需要將 xml 轉(zhuǎn)化成 model 對(duì)象,該如何使用呢?下面舉個(gè)例子說(shuō)明一下,將分以下幾步進(jìn)行 1.準(zhǔn)備條件
    的頭像 發(fā)表于 02-19 15:59 ?518次閱讀
    【JAVA UI】【HarmonyOS】【Demo】 <b class='flag-5'>鴻蒙</b>如何進(jìn)行 xml <b class='flag-5'>解析</b>

    鴻蒙開(kāi)發(fā)者預(yù)覽版如何?

    Linux內(nèi)核以及AOSP代碼,采用的鴻蒙內(nèi)核以及代碼,HarmonyOS NEXT系統(tǒng)僅支持鴻蒙內(nèi)核
    發(fā)表于 02-17 21:54

    鴻蒙使用的是微內(nèi)核

    我們常說(shuō),看一個(gè)系統(tǒng)是不是自研,就看它的內(nèi)核,常見(jiàn)的內(nèi)核分為:宏內(nèi)核和微內(nèi)核,當(dāng)然還有兩者結(jié)合體,他們到底有什么區(qū)別? 白話宏內(nèi)核和微
    的頭像 發(fā)表于 01-30 16:43 ?453次閱讀
    <b class='flag-5'>鴻蒙</b>使用的是微<b class='flag-5'>內(nèi)核</b>?

    鴻蒙OS和開(kāi)源鴻蒙什么關(guān)系?

    開(kāi)源鴻蒙(Open Harmony) 鴻蒙系統(tǒng)愿來(lái)的設(shè)計(jì)初衷,就是讓所有設(shè)備都可以運(yùn)行一個(gè)系統(tǒng),但是每個(gè)設(shè)備的運(yùn)算能力和功能都不同,所以內(nèi)核的設(shè)計(jì)上,采用了微內(nèi)核的設(shè)計(jì),除了最基礎(chǔ)的功
    的頭像 發(fā)表于 01-30 15:44 ?1084次閱讀
    <b class='flag-5'>鴻蒙</b>OS和開(kāi)源<b class='flag-5'>鴻蒙</b>什么關(guān)系?

    結(jié)構(gòu)與指針的關(guān)系

    在C語(yǔ)言中,結(jié)構(gòu)(Struct)是一種用戶自定義的數(shù)據(jù)類型,它允許您將不同類型的數(shù)據(jù)項(xiàng)組合在一起,以便形成一個(gè)更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)結(jié)構(gòu)可以
    的頭像 發(fā)表于 01-11 08:00 ?943次閱讀
    <b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>與指針的關(guān)系

    golang結(jié)構(gòu)如何定義?如何使用呢?

    結(jié)構(gòu)是go語(yǔ)言最重要的數(shù)據(jù)結(jié)構(gòu)之一,go和其它編程語(yǔ)言不一樣,它沒(méi)有類的概念,類比過(guò)來(lái)struct就相當(dāng)于其它語(yǔ)言中的類,因此十分重要
    的頭像 發(fā)表于 11-28 10:36 ?418次閱讀

    golang結(jié)構(gòu)實(shí)例代碼

    結(jié)構(gòu)是go語(yǔ)言最重要的數(shù)據(jù)結(jié)構(gòu)之一,go和其它編程語(yǔ)言不一樣,它沒(méi)有類的概念,類比過(guò)來(lái)struct就相當(dāng)于其它語(yǔ)言中的類,因此十分重要
    的頭像 發(fā)表于 11-28 10:35 ?428次閱讀