国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

研究筆記

2022-09-21 19:38 作者:スレーブ_スレイヤー  | 我要投稿

前兩天我一直有一個(gè)疑問(wèn):一個(gè)復(fù)雜的類(lèi)在編譯以后,以什么樣的形態(tài)存在于內(nèi)存。

我的設(shè)想是,所有字段按順序排列,然后是每個(gè)函數(shù)的地址按順序排列。

現(xiàn)在看極度無(wú)厘頭的想法,當(dāng)時(shí)卻深信不疑,想了想原因也很簡(jiǎn)單:

按照面向?qū)ο蟮乃枷?,字段和函?shù)必定放在一起。


結(jié)論就是,面向?qū)ο蟮乃枷胫贿m用于編碼階段,在運(yùn)行時(shí)類(lèi)的函數(shù)和字段沒(méi)有任何聯(lián)系。類(lèi)只是對(duì)內(nèi)存的抽象,是由人類(lèi)創(chuàng)造出的概念,計(jì)算機(jī)內(nèi)部的運(yùn)行是沒(méi)有這個(gè)概念的。


于是結(jié)論1:在運(yùn)行時(shí)(或者說(shuō)編譯以后),一個(gè)類(lèi)的字段和函數(shù)沒(méi)有任何聯(lián)系。

疑問(wèn):怎么保證函數(shù)的正確調(diào)用?第一個(gè)參數(shù)傳this指針就行了。調(diào)用方怎么知道this指針的地址?編譯器會(huì)確保調(diào)用方知道。Why?object->fun();類(lèi)似的句式,意味著調(diào)用方一定持有this指針,編譯器做的只是把這個(gè)指針加到了第一個(gè)參數(shù)。


由此衍生出了一個(gè)新的問(wèn)題,泛型類(lèi)的函數(shù)調(diào)用又是怎么樣的?寫(xiě)了幾個(gè)例子反匯編以后,結(jié)論也很單純,編譯器會(huì)在最后添加一個(gè)參數(shù)傳入泛型對(duì)象的大小。但還有一個(gè)問(wèn)題,程序怎么知道對(duì)象具體的類(lèi)型呢?例如兩個(gè)int和一個(gè)INT64都是8字節(jié)。

我在官方STL的函數(shù)里沒(méi)看到處理這些的代碼,這些信息最終是怎么存儲(chǔ)的依舊是未知。


但這不重要,我真正關(guān)心的是il2cpp編譯方式下,泛型的處理。

上面的結(jié)論都是基于C++的vector,C#的List又是什么情況?

結(jié)論也很單純甚至有點(diǎn)撈:il2cpp編譯器會(huì)為每一個(gè)泛型類(lèi)型的函數(shù)調(diào)用單獨(dú)生成一份匯編代碼。聽(tīng)起來(lái)很撈,幾乎一樣的邏輯生成了可能有幾百幾千份代碼,但它就是這么做的。

當(dāng)然,我還發(fā)現(xiàn)了幾個(gè)比較詭異的地方,我一直認(rèn)為STL存儲(chǔ)的是對(duì)象的引用(地址),但是無(wú)論是vector還是List,它存儲(chǔ)的都是對(duì)象里的值。JAVA表示完全無(wú)法理解。

當(dāng)然兩者都是可行的,并且是可以指定的,但是Java就不行,不存在在一個(gè)List里存儲(chǔ)對(duì)象的值,只能存引用,如果存了多個(gè)相同的引用,改變其中一個(gè)其它的也會(huì)跟著改變。


結(jié)論2:il2cpp編譯下的C#泛型函數(shù),如果指定的類(lèi)型是引用,那么遵循同一套邏輯;如果不是,那么單獨(dú)為這個(gè)函數(shù)生成一份匯編代碼。

差不多就是這樣吧,Java用久了真的有些思維慣性,忽略了一些明明知道的,底層的東西。

研究筆記的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
龙江县| 香港| 龙川县| 清流县| 洛宁县| 清丰县| 太和县| 芦溪县| 太仓市| 高碑店市| 天气| 云阳县| 钟祥市| 和龙市| 阳原县| 特克斯县| 桐柏县| 寿宁县| 宝鸡市| 项城市| 鄂托克前旗| 秭归县| 资中县| 苍山县| 赞皇县| 彭州市| 商都县| 沾益县| 登封市| 密云县| 信阳市| 湟源县| 灌云县| 江口县| 翁牛特旗| 赤峰市| 鹤壁市| 凯里市| 互助| 化德县| 同仁县|