www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當前位置:首頁 > > 程序員寫個解
[導讀]昨天群友發(fā)文詢問,為什么C語言里bool似乎占用4Byte,給bool賦值后,它后面的3個字節(jié) 內(nèi)容也被修改了,并且她還強調(diào)代碼沒有經(jīng)過編譯器優(yōu)化(-O0是關閉優(yōu)化的意思)。

昨天群友發(fā)文詢問,為什么C語言里bool似乎占用4Byte,給bool賦值后,它后面的3個字節(jié) 內(nèi)容也被修改了,并且她還強調(diào)代碼沒有經(jīng)過編譯器優(yōu)化(-O0是關閉優(yōu)化的意思)。

群友很是細心,生成map文件檢查bool類型占用的空間,也確認是1字節(jié)。

我建議他“反匯編源碼,匯編之下無秘密”。

反匯編后確認給變量賦值的匯編指令是"STR",在arm架構下STR指令操作數(shù)占4Byte。

最終它找到原因是在extern變量時寫錯變量類型為int,以至于本應用STRB指令的地方誤用成STR。

extern寫時一時爽、排故火葬場。

編譯器才不管你原始變量定義成什么類型,extern讓他看到什么類型他就認為是什么。讀書時看老師的代碼,很疑惑為什么簡單返回變量值,沒任何邏輯和運算操作,卻要封裝成一個函數(shù)。

老師笑笑:“Too yong Too simple?!?/span>

源碼

他的源碼復現(xiàn)方式我寫在下面,bool類型是C99引入的。


			
// bool.c -------------------------------------#include #include  bool b_a = true;char c_a = 'a';char c_b = 'b';char c_c = 'c'; void fun_print() { printf("%2x %2x %2x %2x\r\n", b_a, c_a, c_b, c_c);} // main.c -------------------------------------#include #include  extern int b_a; // 這里不一樣extern void fun_print(); void main(){ printf("原始值:"); fun_print(); b_a = false; printf("修改后:"); fun_print();}
$ arm-linux-gcc *.c $ ./a.out 原始值: 1 61 62 63修改后: 0  0  0  0

extern引發(fā)的錯誤,就算生成map文件也是看不出的,下面能看到b_a僅占用1Byte, 后面緊跟著c_a變量

$ arm-linux-gcc *.c -Wl,-Map=gcc.map$ cat gcc.map | grep b_a -C 3 .data 0x00011028        0x4 /tmp/ccmJQHpj.o 0x00011028 b_a 0x00011029 c_a 0x0001102a c_b 0x0001102b c_c


匯編之下無秘密

$ arm-linux-objdump -S a.out  > b.dis

被錯誤聲明成整型。

 extern int b_a; b_a = false; 843c:  e59f3024   ldr  r3, [pc, #36]  8440:  e3a02000   mov  r2, #0 8444:  e5832000   str  r2, [r3]

正確聲明成布爾類型。

 extern bool b_a; b_a = false; 843c:  e59f3024   ldr  r3, [pc, #36]  8440:  e3a02000   mov  r2, #0 8444:  e5c32000   strb    r2, [r3]

思考

查閱stdbool.h源碼,C語言并沒有對true和false特殊定義,而是直接定義成1和0,相當于 true和false都占用4byte。

思考:既然C語言根本沒有1bit的類型,那么它是怎么實現(xiàn)bool類型“邏輯判斷”的呢?

你可以像我上文那樣反匯編看看。再思考按照反匯編的運作方式,它會遇到什么坑?

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

阿聯(lián)酋迪拜2025年8月26日 /美通社/ -- 納斯達克上市公司Robo.ai Inc.今日正式宣布完成品牌煥新升級,并于8月26日正式啟用全新納斯達克股票代碼"...

關鍵字: AI 人工智能 代碼 智能科技

北京2025年8月13日 /美通社/ -- 近日,北京積算科技有限公司(以下簡稱"積算科技")推出一站式AlphaFold3在線算力服務,現(xiàn)已開放免費使用。其內(nèi)置優(yōu)化后的AlphaFold3模型,支持...

關鍵字: ALPHA 代碼 圖形化 蛋白質(zhì)

北京2025年7月21日 /美通社/ -- 浪潮信息宣布元腦企智一體機已率先完成對Kimi K2 萬億參數(shù)大模型的適配支持,并實現(xiàn)單用戶70 tokens/s的流暢輸出速度,為企業(yè)客戶高效部署應用大模型提供高處...

關鍵字: 模型 AGENT TOKEN 代碼

鏈表作為一種基礎的數(shù)據(jù)結(jié)構,在程序設計中扮演著重要角色。掌握鏈表的高效操作技巧,特別是逆序、合并和循環(huán)檢測,對于提升算法性能和解決復雜問題至關重要。本文將詳細介紹這些操作的C語言實現(xiàn),并分析其時間復雜度。

關鍵字: 鏈表 C語言

在C/C++多文件編程中,靜態(tài)變量(static)與全局變量的作用域規(guī)則看似簡單,實則暗藏諸多陷阱。開發(fā)者若未能準確理解其鏈接屬性與生命周期,極易引發(fā)難以調(diào)試的內(nèi)存錯誤、競態(tài)條件以及維護災難。本文將深入剖析這兩類變量的作...

關鍵字: 靜態(tài)變量 全局變量 C語言

在嵌入式系統(tǒng)和服務器開發(fā)中,日志系統(tǒng)是故障排查和運行監(jiān)控的核心組件。本文基于Linux環(huán)境實現(xiàn)一個輕量級C語言日志庫,支持DEBUG/INFO/WARN/ERROR四級日志分級,并實現(xiàn)按大小滾動的文件輪轉(zhuǎn)機制。該設計在某...

關鍵字: C語言 嵌入式系統(tǒng)

在嵌入式系統(tǒng)和底層驅(qū)動開發(fā)中,C語言因其高效性和可控性成為主流選擇,但缺乏原生單元測試支持成為開發(fā)痛點。本文提出一種基于宏定義和測試用例管理的輕量級單元測試框架方案,通過自定義斷言宏和測試注冊機制,實現(xiàn)無需外部依賴的嵌入...

關鍵字: C語言 嵌入式系統(tǒng) 驅(qū)動開發(fā)

在嵌入式系統(tǒng)開發(fā)中,實時操作系統(tǒng)(RTOS)的任務調(diào)度算法直接影響系統(tǒng)的響應速度和資源利用率。時間片輪轉(zhuǎn)(Round-Robin, RR)作為一種經(jīng)典的公平調(diào)度算法,通過為每個任務分配固定時間片實現(xiàn)多任務并發(fā)執(zhí)行。本文將...

關鍵字: 實時操作系統(tǒng) RTOS C語言

在Linux設備驅(qū)動開發(fā)中,等待隊列(Wait Queue)是實現(xiàn)進程睡眠與喚醒的核心機制,它允許進程在資源不可用時主動放棄CPU,進入可中斷睡眠狀態(tài),待資源就緒后再被喚醒。本文通過C語言模型解析等待隊列的實現(xiàn)原理,結(jié)合...

關鍵字: 驅(qū)動開發(fā) C語言 Linux

在嵌入式系統(tǒng)開發(fā)中,C語言與匯編的混合編程是優(yōu)化性能、訪問特殊指令或硬件寄存器的關鍵技術。然而,內(nèi)聯(lián)匯編的語法差異和寄存器使用規(guī)則常導致難以調(diào)試的問題。本文以ARM Cortex-M和x86架構為例,系統(tǒng)梳理內(nèi)聯(lián)匯編的核...

關鍵字: C語言 匯編混合編程
關閉