色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

真刀真槍模塊化(2.5)— 掩碼結構體

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-14 21:00 ? 次閱讀
作者: GorgonMeducer 傻孩子
首發(fā):裸機思維


【說在前面的話】


在本系列的前一篇文章《真刀真槍模塊化(2)——圖解Service模型》中,我們介紹了一種模塊化封裝的模型——Service模型。該模型的設計理念實際上服務于一個叫做“黑盒子哲學”的設計思維,其核心思想是:

  • 將模塊視作一個黑盒子:模塊的設計者不用向外透露黑盒子的實現(xiàn)細節(jié);同時模塊的使用者也無法看到黑盒子的內部。
  • 模塊的設計者和模塊的使用者完全通過“接口”來進行約定和溝通。這里所有的接口約定都是通過接口頭文件來進行描述和傳遞的。
  • 接口(及接口頭文件)遵循“最小信息公開原則”,即,任何跟使用模塊所提供的服務無關的、或者非必要(可有可無)信息都應該從接口頭文件中刪除。

實踐中,要想實現(xiàn)黑盒子,我們實際上要完成兩大任務:

  1. 如何隱藏模塊的實現(xiàn),或者說隱藏源代碼;
  2. 接口頭文件中數(shù)據(jù)結構的保護,或者說如何阻止用戶繞開模塊所提供的API而直接訪問關鍵結構體的內部(私有)成員;

對于第一條來說,我們只需要把模塊編譯成library,連同接口頭文件一起提供給客戶使用就可以做到;而對于第二條要想實現(xiàn)起來卻并非那么簡單——雖然我們常常說C語言可以通過結構體來模擬類的概念,但它卻無法像C++的類那樣提供對私有(private)和受保護(protected)成員的隱藏。換句話說,在實踐“最小信息公開原則”的時候,如果用戶調用服務的時候,確實需要用到結構體(這個結構體是最小信息),如何防止結構體的定義信息被“非法使用”,就成了一個切實的難題。
為了讓后續(xù)的討論更為清晰,我們不妨具體的定義一下我們的任務:

  • 只允許用戶使用結構體的大小對齊信息——這樣用戶可以自由的定義變量,或是通過malloc這樣的函數(shù)進行動態(tài)分配;
  • 以某種“通過實際手段強制了的君子協(xié)定”的形式——僅在語法層面——阻止用戶直接訪問結構體的成員。

要想同時做到以上兩點,離不開今天索要介紹的主角:掩碼結構體(Masked Structure)。
【什么是掩碼結構體】


要想理解掩碼結構體,拋開復雜和抽象的文字描述,我們不妨來看一個具體的例子:假設我們做了一個字節(jié)隊列的模塊,其中最核心的結構體 byte/_queue/_t 的定義如下:

typedef struct byte_queue_t byte_queue_t;

針對這一結構體(或者叫類)我們提供一系列API(或者叫類的方法),比如:

typedef struct byte_queue_cfg_t {

為了保證模塊的正常工作,防止運行期間,用戶為了自身的便利,直接”外科手術式的“訪問 byte/_queue/_t 的成員導致不必要的問題(比如用戶說:我知道你遵循的是最小信息公開原則,也就是說,只要你放了結構體在接口頭文件里,我當然理解為我可以任意使用咯?),我們想將整個 byte/_queue/_t 都保護起來——這就好比,我們試圖引入一個“蒙版”,遮住結構體的成員信息然后在客戶的耳邊念起魔咒:
你什么都看不到,你看到了也沒法用……
你什么都看不到,你看到了也沒法用……
你什么都看不到,你看到了也沒法用……

...

要想實現(xiàn)這樣的“蒙版效果”其實并不困難,只需要知道要屏蔽的部分實際占用memory的大小,再根據(jù)這一大小來定義數(shù)組即可,因此,我們可以修改對應的定義為:

typedef struct byte_queue_t byte_queue_t;

這里,我們實際上是給原來的類型重命名為/_/_byte/_queue/_t,并建立了一個內部只使用數(shù)組來“濫竽充數(shù)”的替身——也就是我們所說的掩碼結構體。

如果你看過我之前的文章《漫談C變量——對齊(3)》,你會注意到,上述替身實際上丟失了結構體 /_/_byte/_queue/_t 的對齊信息——容易注意到 struct /_/_byte/_queue/_t 的結構體整體是對齊到 4 字節(jié)的,而掩碼結構體中數(shù)組chMask本身是對齊到字節(jié)的——這會導致當用戶使用掩碼結構體來定義變量時,由編譯器分配的空間可能無法滿足原結構體對對齊的要求,造成非對齊訪問——輕則性能下降,重則hardfault。

要解決這一問題也并不復雜,只需要借助GCC擴展的運算符 /_/_alignof/_/_() 提取目標類型的對齊信息,再使用/_/_attribute/_/_((aligned())) 來設置掩碼數(shù)組的對齊要求就可以了:

typedef struct byte_queue_t byte_queue_t;

至此,掩碼結構體 byte/_queue/_t 擁有了和原本的結構體 struct /_/_byte/_queue/_t 一樣的尺寸和對齊;同時還在“語法”層面阻止了用戶直接訪問結構體成員的可能(當然,這也只能防君子不防小人),我們原本設立的兩個目標都已成功達成。然而,聰明的你會在腦海里浮現(xiàn)出一個疑問——要想掩碼結構體能正常工作,上述信息都必須放置到接口頭文件中,難道用戶是傻子,看不到結構體 /_/_byte/_queue/_t 么?

借助宏的力量,我們可以成功的隱藏住 struct /_/_byte/_queue/_t 的存在。


下面的宏只是為了演示一種簡單的實現(xiàn)方法,暫時的打消你的疑慮,而實際在后面我們將要介紹的PLOOC模板中所使用的技法則更為復雜。由于本文只是著重于實際工程實踐中如何簡單的應用掩碼結構體,而不在于介紹復雜的宏技巧,因此我們將不在討論 PLOOC的實現(xiàn)細節(jié)。


#definedeclare_class(__name)     /

借助上述宏,我們可以將接口頭文件 byte/_queue.h 中代碼簡化為:

...

而模塊源代碼中,則可以使用 class/_internal() 來獲取原本的結構體類型:

...

【如何使用PLOOC來簡化開發(fā)】


PLOOCProtected Low-overheadObject-Oriented programming with ANSI-C的英文縮寫,意為:為(類)提供保護的、低開銷的、面向對象C語言開發(fā)。它是我在 Github 上的一個開源項目(https://github.com/GorgonMedu...)。PLOOC 是目前已知唯一使用掩碼結構體對私有(private)和受保護(protected)的成員提供隱藏的OOPC模板;除此以外,通過幾近于0的額外資源消耗來實現(xiàn)面向對象封裝特性,也是PLOOC的一大賣點。

雖然PLOOC自帶的 MDK 例子工程演示了常見的面向對象特性,但處于時間問題,仍然沒有來得及提供一份簡單直接的手把手使用教程。這里我們仍然以 byte/_queue/_t 為例,為大家介紹一下如何在自己的工程中部署 PLOOC,并應用到 service模型中。

準備階段

  • 從Github上下載最新的 release 版本。

  • 解壓縮后重命名目錄為 PLOOC,并復制到你的目標工程中

  • 在你的工程中添加對PLOOC目錄的引用

  • 在工程配置中打開對 C99 的支持,如果可能,直接開啟 C11和GNU擴展的支持:

  • 如果你使用的是 gcc, clang 或是 arm compiler 6,你還需要打開對微軟擴展的支持(-fms-extensions)并屏蔽一些惱人且無害的 warning:
-fms-extensions -Wno-microsoft-anon-tag -Wno-empty-body


NOTE:如果你使用的是 arm compiler 6,在開啟微軟擴展以后,還需要額外定義一個宏 /_MSC/_VER 來避免底層庫中的一些不必要的編譯錯誤。
至此,我們就完成了 PLOOC 在你工程中的部署。

如何在模塊中部署

仍以 byte/_queue 模塊為例,假設你已經根據(jù) service 模型構建好了目錄結構:

  • 打開接口頭文件 byte/_queue.h 并在靠近結構體定義的地方其中添加以下內容:
/*! /NOTE: Make sure #include "plooc_class.h" is close to the class definition 

這里,我們定義了兩個很重要的宏 /_/_BYTE/_QUEUE/_CLASS/_IMPLEMENT/_/_BYTE/_QUEUE/_CLASS/_INHERIT/_/_。容易看出,他們分別是根據(jù)

__<模塊名稱>_CLASS_IMPLEMENT

__<模塊名稱>_CLASS_INHERIT__

的形式改寫而成的。前者的作用是給 C 源代碼標記“我是這個類的實現(xiàn),我是類的主人”的身份用的;后者的作用是給 C代碼標記“我是派生類的實現(xiàn),我派生自基類”。具體使用方法,后面會具體介紹。
需要特別強調的是,一定不要忘記在接口頭文件的尾部將這兩個宏都undef掉

...
  • 在 byte/_queue.h 里定義目標類:
//! /name class byte_queue_t

值得注意的是,這里我們用 private/_member()protected/_member()的形式規(guī)定了成員變量的屬性:其中private的成員是只有類的主人自己可見;而 protected的成員是類的主人以及派生類都可見。如果你想指定某些成員是公共可見的,則可以使用 public/_member()。

  • 打開 byte/_queue.c,在文件的最開始通過定義宏 /_/_BYTE/_QUEUE/_CLASS/_IMPLEMENT 來標記自己“類主人”的身份,當然,別忘記包含自己的接口頭文件:
#define __BYTE_QUEUE_CLASS_IMPLEMENT
  • 在 byte/_queue.c 中,如果某個函數(shù)(類的方法)試圖訪問類的成員,則應該首先借助 class/_internal() 來“脫下馬甲”。方法跟前文一樣,這里就不再贅述。

完整的例子在 PLOOC 的example目錄下:諸如派生類應該如何處理,函數(shù)重載應該如何實現(xiàn)等等問題,大家可以打開MDK的例子工程后“細品”。

【后記】


掩碼結構體是一種全新的方法,可以在語法層面上限制模塊的使用者對關鍵的結構體(類)成員的訪問。相比大家熟悉的“不完全類型”,掩碼結構體攜帶了足夠的信息(大小信息和對齊信息),從而允許模塊的使用者自由的定義變量或是動態(tài)分配,這與“不完全類型”必須依賴動態(tài)分配的缺點形成了鮮明的對比。
曾幾何時,掩碼結構體還有“模塊的.c不能包含模塊的接口頭文件” 這樣的限定,在最新的PLOOC中,這一問題已經得到了徹底的解決——再也不用擔心 ".c" 和 ".h" 中的類型描述不一致導致的運行時錯誤。
最后,需要強調一下,對 service 模型來說,掩碼結構體,或者說PLOOC的使用只是“錦上添花”——并非必須。讀者完全可以根據(jù)自己的喜好來決定模塊的實現(xiàn)方式。如果你喜歡或者對PLOOC使用有什么建議,歡迎在 github上提交你的issue。


審核編輯 黃昊宇

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

    關注

    73

    文章

    5512

    瀏覽量

    121410
收藏 人收藏

    評論

    相關推薦

    模塊化結構與同容量分立器件結構的不同

    模塊化結構提高了產品的密集性、安全性和可靠性,同時也可降低裝置的生產成本,縮短新產品進入市場的周期,提高企業(yè)的市場競爭力。由于電路的聯(lián)線已在模塊內部完成,因此,縮短了元器件之間的連線,可實現(xiàn)優(yōu)化布線
    發(fā)表于 09-09 09:15

    模塊化程序設計

    模塊化程序設計思想,單片機c語言的模塊化設計,方便移植,將程序封裝備用。
    發(fā)表于 03-22 15:29 ?9次下載

    AMD二代霄龍迎來歷史上的最佳機遇

    AMD Ryzen銳龍這兩年讓微處理器乃至是整個PC領域煥發(fā)了新的勃勃生機,喜聞樂見的真刀真槍激烈競爭重現(xiàn)江湖,是整個行業(yè)以及所有消費者的福音。
    發(fā)表于 07-02 15:17 ?597次閱讀

    愛立信:5G提前開花結果,中國市場期待真正收獲

    在5G真刀真槍的開啟商用元年之后,百年老店也持續(xù)露出復蘇態(tài)勢。
    的頭像 發(fā)表于 07-22 11:26 ?2028次閱讀

    西門子s7-300模塊化結構及組成部分

    基本的模塊化硬件結構結構包括機架、電源、處理器CPU、輸入輸出I/O模塊、編程或通訊用接口,圖1表示了一個模塊化控制器是如何由
    的頭像 發(fā)表于 02-22 06:56 ?1.9w次閱讀
    西門子s7-300<b class='flag-5'>模塊化</b><b class='flag-5'>結構</b>及組成部分

    模塊化UPS電源的分布結構

    分布式是早期模塊化UPS經常使用的一種架構。此類模塊化UPS系統(tǒng)層面上等價于數(shù)臺獨立的UPS直接并聯(lián),其功率模塊利用小型UPS改造而成,可自主獨立工作。
    發(fā)表于 05-29 10:25 ?1547次閱讀

    真刀真槍模塊化(2)—圖解Service模型

    作者: GorgonMeducer 傻孩子首發(fā):裸機思維 【說在前面的話】在前面一篇文章《真刀真槍模塊化(1)——一本糊涂賬》中,我們討論了:在工...
    的頭像 發(fā)表于 12-14 22:38 ?532次閱讀

    FPGA模塊化設計與AlteraHardCopy結構化ASIC

    本文檔的主要內容詳細介紹的是FPGA模塊化設計與AlteraHardCopy結構化ASIC。
    發(fā)表于 01-20 17:03 ?6次下載
    FPGA<b class='flag-5'>模塊化</b>設計與AlteraHardCopy<b class='flag-5'>結構化</b>ASIC

    華為模塊化數(shù)據(jù)中心解決方案顯著提升模塊化建筑結構的抗震性能

    近日,華為聯(lián)合同濟大學申報的預制模塊化數(shù)據(jù)中心解決方案磐石架構技術——箱式模塊化數(shù)據(jù)中心建筑結構設計技術與設計軟件開發(fā)技術,榮獲中國建筑學會科技進步獎。這是繼2020年,該技術獲上海市建筑學會科技進步獎后,再次實現(xiàn)“跨界出圈”,
    的頭像 發(fā)表于 11-20 14:15 ?3167次閱讀

    真刀真槍模塊化(3.5)——騷操作?不!這才是正統(tǒng)

    首發(fā):裸機思維作者: GorgonMeducer 傻孩子【你可曾懷疑過?】C語言寫多了,或多或少會聽說一些“上古傳下來”的教條,比如:include 語...
    發(fā)表于 01-25 18:28 ?0次下載
    <b class='flag-5'>真刀真槍</b><b class='flag-5'>模塊化</b>(3.5)——騷操作?不!這才是正統(tǒng)

    真刀真槍模塊化(3)—— 層次框架初探

    作者: GorgonMeducer 傻孩子首發(fā):裸機思維(圖片來自網(wǎng)絡,侵刪) 【說在前面的話】在本系列的前面幾篇文章中,我們依次討論了如下的幾...
    發(fā)表于 01-25 19:44 ?0次下載
    <b class='flag-5'>真刀真槍</b><b class='flag-5'>模塊化</b>(3)—— 層次框架初探

    真刀真槍模塊化(1)——一本糊涂賬

    對很多人來,嵌入式軟件開發(fā)過程中?模塊化(Modularization)是一個海市蜃樓、是一個書面詞匯、是一個過氣的時尚——模塊化似乎從未真正的...
    發(fā)表于 01-26 19:33 ?0次下載
    <b class='flag-5'>真刀真槍</b><b class='flag-5'>模塊化</b>(1)——一本糊涂賬

    什么是模塊化自動

    什么是模塊化自動
    的頭像 發(fā)表于 03-10 16:29 ?2914次閱讀
    什么是<b class='flag-5'>模塊化</b>自動<b class='flag-5'>化</b>?

    歐姆龍模塊化編程的使用技巧

    【導讀】在平常使用歐姆龍SysmacStudio 編程時,有新建大量的結構和全局變量,若不分類進行模塊化,會造成查找不方便,下面分享的就是對全局變量和數(shù)據(jù)類型進行模塊分類,方便查找,
    的頭像 發(fā)表于 03-17 17:45 ?2081次閱讀

    PLC模塊化結構化編程實例

    模塊化編程中OB1起著主程序的作用,F(xiàn)C或FB控制著不同的過程任務,相當于主循環(huán)程序的子程序。模塊化編程中被調用塊不向調用塊返回數(shù)據(jù)。
    的頭像 發(fā)表于 07-10 14:42 ?1105次閱讀
    PLC<b class='flag-5'>模塊化</b>和<b class='flag-5'>結構化</b>編程實例
    主站蜘蛛池模板: 青柠在线观看视频在线 | 亚洲精品色情APP在线下载观看 | 欧美精品九九99久久在观看 | 国内久经典AAAAA片 | 亚洲精品久久久WWW游戏好玩 | 国产成人综合在线视频 | 亚洲精品无码国产爽快A片 亚洲精品无码成人AAA片 | 俄罗斯19girl video9 | 91热久久免费精品99 | 火影忍者高清无码黄漫 | 校园高h肉耽文 | 黄色直接观看 | 免费麻豆国产黄网站在线观看 | 国产亚洲视频在线播放香蕉 | 久久久擼擼擼麻豆 | 嫩草国产精品99国产精品 | 果冻传媒mv国产陈若瑶主演 | 91伊人久久大香线蕉 | 曰本少妇高潮久久久久久 | 99久久精品国产高清一区二区 | 视频一区视频二区ae86 | 蜜臀AV色欲A片无码一区 | 久久99精品AV99果冻传媒 | 亚洲国产中文字幕新在线 | 纯肉合集(高H) | 4480yy午夜私人影院 | 亲胸摸下面激烈免费网站 | 肉动漫3D卡通无修在线播放 | 日本伦理电影聚 | 色姊姊真舒服 | 亚洲高清免费在线观看 | 影音先锋电影资源av | 国产免费人成在线看视频 | 久久香蕉国产线看观看首页 | 久久久性色精品国产免费观看 | 精品国产手机视频在在线 | 99视频精品全部 国产 | 国产 高清 无码 在线播放 | 人人澡人人爽人人精品 | 亚洲国产成人久久精品影视 | 免费在线观看黄色网址 |