久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3544|回復: 6
打印 上一主題 下一主題
收起左側

C語言特性,節省空間,保留可讀性

[復制鏈接]
跳轉到指定樓層
#
ID:392682 發表于 2022-4-20 17:31 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
我們開發的電表,基于單片機的,電表的功能越來越多,要求我們再硬件不變的情況下增加這些功能,所以就經常會考慮程序大小問題,有時真的會按字節去省空間,因為,就是那幾個字節編譯就爆掉了。但是還要求盡量程序可維護性好(簡單、直接、易讀)。這時就要去程序中尋找能省空間的地方,能用指針就考慮要不要換指針,犧牲一些可讀性,使用for&if代替switch的一些表達式。重復的語句使用函數代替,使用位域,尋找簡便的程序處理方法等,,打開編譯產生的map文件分析哪里占的存儲大,進行精簡,真是挺有意思的。就好像捉迷藏。

這些省空間的操作有些基于C語言的特性,比如指針,比如位操作,比如位域操作在保留可讀性的情況下代替一堆flag。
struct file_data{
unsigned int day: 5;
unsigned int month: 4;
unsigned int year: 7;
}
struct file_data fd;
fd.day = 20;
fd.month = 4;
fd.year = 22;
這樣定義,變量day占了5個位,month占4個位,year占7位。同時也保留了可讀性。
雖然這種寫法省空間,但是有限,而且不太好用,迫不得已還是別這么搞。但是位操作的話這么些會好看一點如:
struct bits{
unsigned int flag_0: 1;
unsigned int flag_1: 1;
unsigned int flag_2: 1;
unsigned int flag_3: 1;
unsigned int flag_4: 1;
unsigned int flag_5: 1;

unsigned int flag_6: 1;
unsigned int flag_7: 1;

};

struct bits flag_grop;
if(flag_grop.flag_0 == 1)
{
    flag_grop.flag_1 = 0;
}
這樣寫一些還可以。

還有聯合體,在不增加開銷的情況下簡潔的提供了多種解析數據的方式,真是一個不錯的工具
union bits{
u8 data;
unsigned int flag_0: 1;
unsigned int flag_1: 1;
unsigned int flag_2: 1;
unsigned int flag_3: 1;
unsigned int flag_4: 1;
unsigned int flag_5: 1;

unsigned int flag_6: 1;
unsigned int flag_7: 1;


};
union bits flag_grop;

flag_grop = 0xAA;

if(flag_grop.int flag_0 == 1)
{}
if(flag_grop.int flag_1 == 1)
{}
...
如上該聯合體只占了一個字節的空間。提供了兩種方便讀寫操作的解析數據的方式 字節操作與位操作。
聯合體用來處理通訊挺好的。
假設串口發送數據是按字節發送,但是我們要發送的數據可能時16位的或者32位的,還會面臨先發高子節還是低字節問題。1、我們可以使用指針
將一個整型數據分為4次發送。2、我們也可以利用聯合體的特性將整型數據分4次發出。還能增加一點可讀性。


今天看到一句話:no time to be brief 感覺有時用著還挺好

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

6#
ID:392682 發表于 2022-5-4 11:50 | 只看該作者
fj51hei 發表于 2022-4-30 15:02
就是本來沒有位操作指令 你程序卻寫位操作語法 編譯器為滿足你的程序意圖  只能按它自己的想法給你弄一堆 ...

這樣啊,這點真沒想到,當時想當然的認為,位域操作會被轉化為簡單常規的與或非操作了。有點慚愧哈,想當然了?勺x性好點,但是對于節約空間效果可能沒啥效果
回復

使用道具 舉報

5#
ID:824490 發表于 2022-4-30 15:11 | 只看該作者
本帖最后由 名字不是重點 于 2022-4-30 19:13 編輯

我錯了

回復

使用道具 舉報

地板
ID:712493 發表于 2022-4-30 15:02 | 只看該作者
qinshuai 發表于 2022-4-29 16:52
沒太了解,在不支持位操作的單片機上,位域操作會怎加flash的開銷嗎?

就是本來沒有位操作指令 你程序卻寫位操作語法 編譯器為滿足你的程序意圖  只能按它自己的想法給你弄一堆匯編實現了  這樣下來FLASH開銷就大  就如沒有硬件乘除法的單片機  你卻出現很多乘除法  那就不是FLASH開銷大的問題  也會造成程序效率不高的問題
回復

使用道具 舉報

板凳
ID:392682 發表于 2022-4-29 16:52 | 只看該作者
Hephaestus 發表于 2022-4-23 18:35
在不支持位操作的單片機上面,樓主的寫法會嚴重增加代碼長度,節約了ram卻大大浪費了flash,得不償失。

...

沒太了解,在不支持位操作的單片機上,位域操作會怎加flash的開銷嗎?
回復

使用道具 舉報

沙發
ID:883242 發表于 2022-4-23 18:35 | 只看該作者
在不支持位操作的單片機上面,樓主的寫法會嚴重增加代碼長度,節約了ram卻大大浪費了flash,得不償失。

在支持位操作的單片機上,比如51,用專門的關鍵字bdata、bit來操作也比樓主的寫法節約了很大的空間。

所以樓主的文章,沒有什么用。
回復

使用道具 舉報

樓主
ID:301191 發表于 2022-4-23 18:28 | 只看該作者
頂一下
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av一区二区三区 | 黑人巨大精品欧美一区二区免费 | 亚洲三级在线 | 黄色大片在线播放 | 日韩视频区 | 国产欧美在线 | 久久狠狠 | 怡红院怡春院一级毛片 | 毛片区 | 成人看片在线观看 | 中文无吗 | 亚洲视频在线一区 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 欧美福利影院 | 日韩在线免费视频 | 久久精品成人热国产成 | 久久精品亚洲精品国产欧美 | 亚洲色图第一页 | 成人影院一区二区三区 | 成人深夜福利 | 免费一区在线 | 久久69精品久久久久久久电影好 | 国产福利在线视频 | 亚洲va欧美va天堂v国产综合 | 成人免费黄视频 | 国产99热精品 | 91视频在线看 | 精品国产乱码久久久久久蜜柚 | 国产精品九九九 | 超黄毛片 | 久久精品中文 | 91精品久久久久久久99 | 男人的天堂久久 | 日韩中文字幕第一页 | 精久久久 | 91伦理片| 一区免费| 国产成人麻豆免费观看 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 久操亚洲| 激情欧美一区二区三区中文字幕 |