女人被狂躁到高潮视频免费无遮挡,内射人妻骚骚骚,免费人成小说在线观看网站,九九影院午夜理论片少妇,免费av永久免费网址

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

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

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

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

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

最終它找到原因是在extern變量時(shí)寫(xiě)錯(cuò)變量類(lèi)型為int,以至于本應(yīng)用STRB指令的地方誤用成STR。

extern寫(xiě)時(shí)一時(shí)爽、排故火葬場(chǎng)。

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

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

源碼

他的源碼復(fù)現(xiàn)方式我寫(xiě)在下面,bool類(lèi)型是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ā)的錯(cuò)誤,就算生成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


匯編之下無(wú)秘密

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

被錯(cuò)誤聲明成整型。

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

正確聲明成布爾類(lèi)型。

 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語(yǔ)言并沒(méi)有對(duì)true和false特殊定義,而是直接定義成1和0,相當(dāng)于 true和false都占用4byte。

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

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

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

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

關(guān)鍵字: AI 人工智能 代碼 智能科技

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

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

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

關(guān)鍵字: 模型 AGENT TOKEN 代碼

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

關(guān)鍵字: 鏈表 C語(yǔ)言

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

關(guān)鍵字: 靜態(tài)變量 全局變量 C語(yǔ)言

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

關(guān)鍵字: C語(yǔ)言 嵌入式系統(tǒng)

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

關(guān)鍵字: C語(yǔ)言 嵌入式系統(tǒng) 驅(qū)動(dòng)開(kāi)發(fā)

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

關(guān)鍵字: 實(shí)時(shí)操作系統(tǒng) RTOS C語(yǔ)言

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

關(guān)鍵字: 驅(qū)動(dòng)開(kāi)發(fā) C語(yǔ)言 Linux

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

關(guān)鍵字: C語(yǔ)言 匯編混合編程
關(guān)閉