日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Rust的胖指針到底胖在棧上還是堆上,objdump( 二 )


細(xì)究這兩個概念的區(qū)別并不是本文的重點,所以這里粗略的對“淺拷貝”和“深拷貝”做如下區(qū)分,對于把變量 a 拷貝給 b:如果拷貝后,b 的內(nèi)容完全等于 a,并且兩個變量在內(nèi)存中是獨立的,則稱此次拷貝為“深拷貝” 。如果靠背后,只是通過 b 能夠訪問 a 中的內(nèi)容,a 的內(nèi)容改變時,b 的“內(nèi)容”也隨之改變,則稱此次拷貝為“淺拷貝” 。
這樣看來,就本例而言,b = a;顯然是一次“深拷貝”,因為 a,b 在內(nèi)存中彼此獨立,并且拷貝后,b 的內(nèi)容和 a 的內(nèi)容完全相同 。那C語言的結(jié)構(gòu)體賦值拷貝一定是“深拷貝”嗎?我們將結(jié)構(gòu)體 s 新增一個指針成員 buf:對 a 的初始化也做相應(yīng)修改,相關(guān)C語言代碼如下,請看:為了討論主題,上述C語言代碼沒有做錯誤處理 。
現(xiàn)在 b = a; 還是“深拷貝”嗎?讀者如果做了實驗,應(yīng)該會發(fā)現(xiàn),b 的 buf 成員本身在內(nèi)存中的確獨立于 a 的 buf 成員,但是它指向的內(nèi)存卻與 a 的 buf 成員指向的內(nèi)存是同一塊,所以這時 b = a; 不再是純粹的“深拷貝”了 。小結(jié)本節(jié)主要討論了C語言結(jié)構(gòu)體的賦值語法可以用于拷貝,并針對之前讀者的幾個典型問題做了較為詳細(xì)的實例探討 。
不過,C語言是一門非常靈活的編程語言,可能同樣的一條語句,在不同的環(huán)境下執(zhí)行結(jié)果是不一樣的,這一點本文最后的討論就是一個實例 。應(yīng)該明白,本文舉的例子僅是為了拋磚引玉,展示遇到問題該如何分析的方法,學(xué)習(xí)C語言,應(yīng)該樂于做實驗嘗試才對 。歡迎在評論區(qū)一起討論,質(zhì)疑 。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦 。
c語言程序經(jīng)過編譯后,每條指令都有一個內(nèi)存地址,那兩個程序如果有相同內(nèi)存地址的指令怎么辦?
【Rust的胖指針到底胖在棧上還是堆上,objdump】

Rust的胖指針到底胖在棧上還是堆上,objdump


把一個程序自己的代碼、數(shù)據(jù)、堆??闯梢粔K完整的磚頭 。編譯器就是造磚機(jī),安排好這一塊磚內(nèi)部的結(jié)構(gòu) 。裸奔的系統(tǒng)就這一塊磚,不會發(fā)生相互覆蓋的矛盾 。如果跑多任務(wù),磚頭就多了 。但這時通常會引入操作系統(tǒng)來管理磚頭 。堆砌磚頭時會給每塊磚頭不一樣的起始坐標(biāo),確保不發(fā)生兩塊磚頭占一個空間的情況 。早期的dos操作系統(tǒng)規(guī)定每塊磚頭高度不超過1M 。
編譯器做出來的每塊磚內(nèi)部都是用偏移地址0000h—ffffh來區(qū)分單元,但是操作系統(tǒng)在往物理內(nèi)存搬磚堆砌時,會給每塊磚不同的段起始地址,和偏移地址加在一起才是物理地址 。這樣就不會發(fā)生重疊了 。當(dāng)然這里也有編譯器的功勞 。編譯器除了造磚,還會生成一個規(guī)格標(biāo)簽,用于通知操作系統(tǒng)這磚有多大多厚,讓操作系統(tǒng)能好好堆磚不浪費空間 。
不同操作系統(tǒng)的這種規(guī)格標(biāo)簽格式不一樣,因此windows程序是不能直接跑在linux下的 。后來的處理器出現(xiàn)了mmu,內(nèi)存管理單元,程序的地址空間和物理地址空間的換算就更復(fù)雜了 。但是保證不同程序各自空間不發(fā)生覆蓋還是基本要求 。一個程序能覆蓋別的程序空間,大概是病毒惡意代碼才做的事情 。cpu的安全特性越來越強(qiáng),這種情況很少見了吧 。

推薦閱讀